读书人

java动态代理下是否能再进行一层代理

发布时间: 2012-09-05 15:19:34 作者: rapoo

java动态代理上是否能再进行一层代理

CGLIB动态代理类

?

import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {      private Object target;        /**      * 创建代理对象      *       * @param target      * @return      */      public Object getInstance(Object target) {          this.target = target;          Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(this.target.getClass());          // 回调方法          enhancer.setCallback(this);          // 创建代理对象          return enhancer.create();      }        @Override      // 回调方法      public Object intercept(Object obj, Method method, Object[] args,              MethodProxy proxy) throws Throwable {          System.out.println("事物开始CGLIB");          proxy.invokeSuper(obj, args);          System.out.println("事物结束CGLIB");          return null;      }        }  

?

?java动态代理类

?

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import org.springframework.aop.framework.AopProxy;public class ClassProxy implements InvocationHandler ,AopProxy{      private Object target;      /**      * 绑定委托对象并返回一个代理类      * @param target      * @return      */      public Object bind(Object target) {          this.target = target;          //取得代理对象          return Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)      }        @Override      /**      * 调用方法      */      public Object invoke(Object proxy, Method method, Object[] args)              throws Throwable {          Object result=null;          System.out.println("事物开始");          //执行方法          result=method.invoke(target, args);          System.out.println("事物结束");          return result;      }@Overridepublic Object getProxy() {System.out.println("test getProxy");return null;}@Overridepublic Object getProxy(ClassLoader classLoader) {System.out.println("test getProxy");return null;}}

?

尝试在java动态代理上进行java动态代理或者cglib代理,或者cglib代理上进行java动态代理或者cglib代理测试结果如下:

import java.lang.reflect.Modifier;import org.springframework.aop.framework.AopProxy;public class TestProxy {public static void main(String[] args) {//ClassProxy proxy = new ClassProxy();//AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());//bookProxy.getProxy();//    int i = bookProxy.getClass().getModifiers();//        String mods = Modifier.toString(i);//        System.out.println("Class modifiers: " + mods);//CglibProxy cglib = new CglibProxy();//ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  //bookCglib.getProxy();//ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);  //bookCglib2.getProxy();//JDK代理后再进行一层jdk代理,测试结果不可以,循环调用,造成代理的死循环//ClassProxy proxy = new ClassProxy();//AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());//AopProxy bookProxy2 = (AopProxy) proxy.bind(bookProxy);//bookProxy2.getProxy();//jdk代理后再用cglib进行代理,测试结果不行,因为jdk代理后的类是public final类型的,cglib不能对final的类进行代理//ClassProxy proxy = new ClassProxy();//AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());//bookProxy.getProxy();//    int i = bookProxy.getClass().getModifiers();//        String mods = Modifier.toString(i);//        System.out.println("Class modifiers: " + mods);//CglibProxy cglib = new CglibProxy();//ClassProxy bookCglib=(ClassProxy)cglib.getInstance(bookProxy);  //bookCglib.getProxy();//CGlib代理后再进行cglib代理,测试结果不可以  Caused by: java.lang.ClassFormatError: Duplicate method name&signature //CglibProxy cglib = new CglibProxy();//ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  //ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);  //bookCglib2.getProxy();//CGlib代理后再进行jdk代理,测试结果不可以,因为CGlib代理后已经改变了类的签名,而jdk必须知道类的接口和实现CglibProxy cglib = new CglibProxy();ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  bookCglib.getProxy();ClassProxy proxy = new ClassProxy();AopProxy bookProxy = (AopProxy) proxy.bind(bookCglib);bookProxy.getProxy();}}
?

读书人网 >编程

热点推荐