JDK 1.3以后提供了动态代理的技术,
JDK
的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中
InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一
起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。
上代码:三个类Client、InvocationHandlerObject、ProxyFactory
1. InvocationHandlerObject类,继承InvocationHandler接口,实现invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 实现一个接口InvocationHandler,让这个新的代理去调用
* @author wee
*
*/
public class InvocationHandlerObject implements InvocationHandler {
Object acturyObj;
InvocationHandlerObject(Object o) {
acturyObj = o;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out
.println("InvocationHandlerObject.invoke()..............<in>......... ");
pre();
if (args != null) {
System.out.println(" args.length " + args.length + " ");
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
// 这里,有几个对象/类的关系要搞清楚
// acturyObj 是被代理的对象
// proxy 是动态生成的代理对象
// InvocationHandlerObject 是被proxy对象调用的,同时它有调用 acturyObj
// proxy --> InvocationHandlerObject --> acturyObj
System.out.println("Action method " + method.getName());
System.out.println("acturyObj" + acturyObj.getClass());
System.out.println("proxy" + proxy.getClass());
Object mo = method.invoke(acturyObj, args);
post();
System.out
.println("InvocationHandlerObject.invoke()..............<out>......... ");
return mo;
}
public void pre() {
System.out.println("InvocationHandlerObject.pre()");
}
public void post() {
System.out.println("InvocationHandlerObject.post()");
}
}
2. ProxyFactory类,产生proxy实例。
import java.lang.reflect.Proxy;
/**
* .定义一个工厂,其实本质上就是利用这个方法Proxy.newProxyInstance() 产生一个Proxy实例
* @author wee
*
*/
public class ProxyFactory {
Object factory(Object obj) {
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), new InvocationHandlerObject(obj));
}
}
3. Client类,测试用。
import java.util.List;
import java.util.Vector;
public class Client {
public static void main(String[] args) {
List list = (List) new ProxyFactory().factory(new Vector(10));
list.add("add method in list 1");
}
}