//jdk动态代理
public class ProxyInvocationHandlerUtil implements InvocationHandler {
//被代理的接口
private Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
};
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行前后可动态添加其他方法,如:执行日志;
//利用反射执行方法
Object result = method.invoke(obj,args);
return result;
}
}
public static void main(String[] args) {
//真实角色
UserImpl userImpl = new UserImpl();
//代理角色
ProxyInvocationHandlerUtil pih = new ProxyInvocationHandlerUtil();
//设置要代理的对象
pih.setObj(userImpl);
//动态生成代理类
User user = (User) pih.getProxy();
//执行方法
user.add();
}
Proxy
java在JDK1.5之后提供了一个"java.lang.reflect.Proxy"类,通过"Proxy"类提供的一个newProxyInstance方法用来创建一个对象的代理对象。
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
newProxyInstance方法用来返回一个代理对象,这个方法总共有3个参数:
- ClassLoader loader:用来指明生成代理对象使用哪个类装载器;
- Class<?>[] interfaces:用来指明生成哪个对象的代理对象,通过接口指定;
- InvocationHandler h:用来指明产生的这个代理对象要做什么事情。
所以我们只需要调用newProxyInstance方法就可以得到某一个对象的代理对象了。
InvocationHandler
调用处理程序。是一个接口, 这个接口只有一个方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
当调用代理类的任何一个方法的时候,invoke方法就会被先调用,这个方法总共有3个参数:
- Object proxy:真实对象(也就是我们要代理的对象)的代理对象,它实际上就是Proxy的newInstance方法返回的对象;
- Method method:原始对象的方法,要执行的方法;
- Object[] args:方法参数。