日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/5 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();}}

轉載于:https://www.cnblogs.com/zhwj184/archive/2012/06/01/3119662.html

總結

以上是生活随笔為你收集整理的java动态代理上是否能再进行一层代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。