java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,List接口定义的业务方法,Vector是List接口的实现,VectorProxy 是InvocationHandler接口实现。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;
public class VectorProxy implements InvocationHandler{
private Object proxyObj;
public VectorProxy(Object obj){
proxyObj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Being calling method: " + method);
for(Object obj: args){
System.out.println(obj + " ");
}
Object o = method.invoke(proxyObj, args);
System.out.println("After class metrhod: " + method);
return o;
}
public static Object factory(Object obj){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new VectorProxy(obj));
}
public static void main(String[] args){
List v = null;
v = (List)factory(new Vector(10));
v.add("hello");
v.add("world");
}
}
输出:
Being calling method: public abstract boolean java.util.List.add(java.lang.Object)
hello
After class metrhod: public abstract boolean java.util.List.add(java.lang.Object)
Being calling method: public abstract boolean java.util.List.add(java.lang.Object)
world
After class metrhod: public abstract boolean java.util.List.add(java.lang.Object)