动态代理有俩种方式
1.jvm代理
2.第三方库代理cglib代理。
区别:前者被代理的类必须实现接口,后者被代理的类没有实现接口 。 使用cglib代理需要导入第三方jar包。
下面详细聊聊
jvm代理中,需要单独写一个类实现接口InvocationHandler,重写里面的invoke方法,这个类把代理对象回传过来,在这个方法中可以定义代理对象要做的事,
如:
invoke(Proxy proxy,Method method Object[] args){
//代理对象替被代理对象所做的事情。还可以额外添加一些方法。如:记录日志。
method.invoke(被代理的对象,args);
}
产生代理对象的过程如下:
Proxy.newProxyInstance(Loader,Infaceter,h);
这个方法需要三个参数分别代表:被代理类的类加载器,被代理类实现 的接口,invocationHandle实现类的的对象。
代理对象产生后,可以直接有代理对象调用被代理类中的方法,就会触发invocationHanle实现类中的invoke方法。
下面说说cglib代理
建一个MethodInterceptor的实现类,重写intercept方法,这个方法中有4个参数,(Object obj, Method method, Object[] args, MethodProxy proxy)以便在方法中使用。和invoke有点类似。
在这个方法中调用proxy.invokeSuper(obj,args);
//产生代理类的工具。
Enhancer enhancer = new Enhancer();
//加载那个被代理的类。
enhancer.setSuperclass(c);
//回传给mycglib(MethodInterceptor的实现类)那个类。
enhancer.setCallback(m);
//产生代理对象。
User p= (User)enhancer.create();
产生代理对象后,直接调用被代理类中的方法。