因为过去业务总是这样,在调用一个类的开始时候要执行某些操作,在执行后也要执行某些操作,这样我就写了一个动态代理类,来执行这些操作,可是他只能执行接口的方法,这样的话,每一个类,要想有这种功能,就要给自己的方法定义一个接口,这样很麻烦,能不能这个类没有接口,也可以使用动态代理类?
下面是我的实现
动态代理类
package Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MethodProxy implements InvocationHandler {
/*
* 代理对象的实例
*/
private Object wrapped;
/*
* 私有的构造方法,不能实例化
*/
private MethodProxy(Object p) {
wrapped = p;
}
/**
* 实现InvocationHandler接口的方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"开始");
Object obj = method.invoke(wrapped, args);
System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"结束");
return obj;
}
public static Object createBuilder(Object toWrap) {
return Proxy.newProxyInstance(toWrap.getClass().getClassLoader(),
toWrap.getClass().getInterfaces(),
new MethodProxy(toWrap));
}
}
测试类
package Proxy;
public class TestProxy {
public static void main(String[] args) {
IPerson p = (IPerson)MethodProxy.createBuilder(new Person());
p.say();
ICat c = (ICat)MethodProxy.createBuilder(new Cat());
c.catchMouse();
IPerson pc = (IPerson) c;
pc.say();
}
}
几个实现
接口
package Proxy;
public interface ICat {
public void catchMouse() ;
}
package Proxy;
public interface IPerson {
public void say();
}
实现
package Proxy;
public class Cat implements ICat,IPerson {
/* (non-Javadoc)
* @see Proxy.ICat#catchMouse()
*/
public void catchMouse() {
System.out.println("mouse");
}
public void say() {
System.out.println("I'm cat");
}
}
package Proxy;
public class Person implements IPerson{
public void say() {
System.out.println("Hello");
}
}
下面是我的实现
动态代理类
package Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MethodProxy implements InvocationHandler {
/*
* 代理对象的实例
*/
private Object wrapped;
/*
* 私有的构造方法,不能实例化
*/
private MethodProxy(Object p) {
wrapped = p;
}
/**
* 实现InvocationHandler接口的方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"开始");
Object obj = method.invoke(wrapped, args);
System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"结束");
return obj;
}
public static Object createBuilder(Object toWrap) {
return Proxy.newProxyInstance(toWrap.getClass().getClassLoader(),
toWrap.getClass().getInterfaces(),
new MethodProxy(toWrap));
}
}
测试类
package Proxy;
public class TestProxy {
public static void main(String[] args) {
IPerson p = (IPerson)MethodProxy.createBuilder(new Person());
p.say();
ICat c = (ICat)MethodProxy.createBuilder(new Cat());
c.catchMouse();
IPerson pc = (IPerson) c;
pc.say();
}
}
几个实现
接口
package Proxy;
public interface ICat {
public void catchMouse() ;
}
package Proxy;
public interface IPerson {
public void say();
}
实现
package Proxy;
public class Cat implements ICat,IPerson {
/* (non-Javadoc)
* @see Proxy.ICat#catchMouse()
*/
public void catchMouse() {
System.out.println("mouse");
}
public void say() {
System.out.println("I'm cat");
}
}
package Proxy;
public class Person implements IPerson{
public void say() {
System.out.println("Hello");
}
}
CGLib与Dynamic Proxy的代理机制基本类似,只是其动态生成的代理对象并非某个
接口的实现,而是针对目标类扩展的子类。
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MethodProxy implements InvocationHandler { private Object oriObject; public Object bind(Object obj)
{
oriObject = obj;
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object result = null;
System.out.println("Before Hello World!");
result = method.invoke(oriObject,args);
System.out.println("After Hello world!");
return result;
}
}package testspring;public class SayHello {
public void SayHello()
{
System.out.println("Hello World!");
}
}package testspring;import testspring.MethodProxy;
import testspring.SayHello;
import java.lang.reflect.Method;public class test {
public test() {
} public static void main(String[] args)throws Exception,Throwable
{
test t = new test();
MethodProxy handler = new MethodProxy();
Object hello = Class.forName("testspring.SayHello").newInstance();
Method m = Class.forName("testspring.SayHello").getMethods()[0];
handler.invoke(handler.bind(hello),m,null);
}
}