站長資訊網
最全最豐富的資訊網站

動態代理的兩種方式是什么

兩種方式為:1、JDK動態代理,利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理;2、CGLIB動態代理,利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。

動態代理的兩種方式是什么

本教程操作環境:windows7系統、java8版、DELL G3電腦。

動態代理是反射的一個非常重要的應用場景。動態代理常被用于一些 Java 框架中。例如 Spring 的 AOP ,Dubbo 的 SPI 接口,就是基于 Java 動態代理實現的。

動態代理的方式有兩種:

  • JDK動態代理:利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。

  • CGLIB動態代理:利用ASM(開源的Java字節碼編輯庫,操作字節碼)開源包,將代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。

區別:JDK代理只能對實現接口的類生成代理;CGlib是針對類實現代理,對指定的類生成一個子類,并覆蓋其中的方法,這種通過繼承類的實現方式,不能代理final修飾的類。

強制使用CGlib

<!-- proxy-target-class="false"默認使用JDK動態代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/>  <aop-config proxy-target-class="true"> <!-- 切面詳細配置 --> </aop-config>

具體代碼示例:

/**  * 目標接口類  */ public interface UserManager {         public void addUser(String id, String password);         public void delUser(String id);     }
/**  * 接口實現類  */ public class UserManagerImpl implements UserManager {              @Override     public void addUser(String id, String password) {             System.out.println("調用了UserManagerImpl.addUser()方法!");     }              @Override     public void delUser(String id) {             System.out.println("調用了UserManagerImpl.delUser()方法!");     }     }
/**  * JDK動態代理類  */ public class JDKProxy implements InvocationHandler {              // 需要代理的目標對象     private Object targetObject;              public Object newProxy(Object targetObject) {         // 將目標對象傳入進行代理             this.targetObject = targetObject;         // 返回代理對象          return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);     }              // invoke方法     @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         // 進行邏輯處理的函數         checkPopedom();         Object ret = null;         // 調用invoke方法         ret = method.invoke(targetObject, args);         return ret;     }              private void checkPopedom() {         // 模擬檢查權限            System.out.println("檢查權限:checkPopedom()!");         }     }
/**  * CGlib動態代理類  */  public class CGLibProxy implements MethodInterceptor {              // CGlib需要代理的目標對象     private Object targetObject;          public Object createProxyObject(Object obj) {         this.targetObject = obj;         Enhancer enhancer = new Enhancer();         enhancer.setSuperclass(obj.getClass());         enhancer.setCallback(this);         Object proxyObj = enhancer.create();         return proxyObj;     }          @Override     public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {         Object obj = null;         // 過濾方法         if ("addUser".equals(method.getName())) {             // 檢查權限             checkPopedom();         }         obj = method.invoke(targetObject, args);         return obj;     }              private void checkPopedom() {         System.out.println("檢查權限:checkPopedom()!");     } }
/**  * 測試類  */ public class ProxyTest {          public static void main(String[] args) {         UserManager userManager = (UserManager)new CGLibProxy().createProxyObject(new UserManagerImpl());         System.out.println("CGLibProxy:");         userManager.addUser("tom", "root");         System.out.println("JDKProxy:");         JDKProxy jdkProxy = new JDKProxy();         UserManager userManagerJDK = (UserManager)jdkProxy.newProxy(new UserManagerImpl());         userManagerJDK.addUser("tom", "root");     } }
// 運行結果 CGLibProxy: 檢查權限checkPopedom()! 調用了UserManagerImpl.addUser()方法! JDKProxy: 檢查權限checkPopedom()! 掉用了UserManagerImpl.addUser()方法!

總結:

1、JDK代理使用的是反射機制實現aop的動態代理,CGLIB代理使用字節碼處理框架asm,通過修改字節碼生成子類。所以jdk動態代理的方式創建代理對象效率較高,執行效率較低,cglib創建效率較低,執行效率高;

2、JDK動態代理機制是委托機制,具體說動態實現接口類,在動態生成的實現類里面委托hanlder去調用原始實現類方法,CGLIB則使用的繼承機制,具體說被代理類和代理類是繼承關系,所以代理類是可以賦值給被代理類的,如果被代理類有接口,那么代理類也可以賦值給接口。

(推薦教程:java入門教程)

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
精品久久久久久久中文字幕| mm1313亚洲精品国产| 久久久精品人妻一区二区三区四| 91精品国产9l久久久久| 精品人妻人人做人人爽夜夜爽 | 久久久久亚洲精品成人网小说 | 69国产精品视频免费| 国产精品va无码一区二区| 91精品全国免费观看青青| 国产精品成人无码久久久久久 | 久久96国产精品| 国产亚洲美女精品久久久久狼| 久久久久九国产精品| 国产精品夜色视频一级区 | 久久伊人精品热在75| 国内精品51视频在线观看| 91久久婷婷国产综合精品青草| 精品福利一区二区三区| 亚洲午夜精品第一区二区8050| 牛牛在线精品观看免费正| 精品一区二区三区无码免费直播| 日韩毛片免费无码无毒视频观看| 手机看片日韩福利| 中文无码日韩欧免费视频| 日韩人妻无码精品无码中文字幕| 国产伦子系列麻豆精品| 国产精品伦理一二三区伦理| 国产精品乱码久久久久久软件 | 日韩一级视频免费观看| 亚洲欧美日韩中文字幕在线一区 | 国产精品看高国产精品不卡| 99久久国产宗和精品1上映| 日韩制服国产精品一区| 亚洲中文字幕久久精品无码APP | 无码人妻精品一区二区三区99性 | 国产精品国语自产拍在线观看| 国产精品高清尿小便嘘嘘| 日本精品αv中文字幕| 国产精品久久久久久久久久久搜索 | jizzjizz国产精品久久| 国产成人精品一区在线|