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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java动态代理和cglib动态代理

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态代理和cglib动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自: http://blog.csdn.net/leon709/article/details/9529307


動態代理應用廣泛,spring,Struts等框架很多功能是通過動態代理,或者進一步封裝來實現的。

常見的動態代理模式實現有Java?API提供的動態代理和第三方開源類庫CGLIB動態代理。

Java?API提供的動態代理是基于類反射實現的,用到的類有:

java.lang.reflect.InvocationHandler;

java.lang.reflect.Method;

java.lang.reflect.Proxy;

其實現是通過Proxy類的newProxyInstance()方法產生代理對象。自定義動態代理類需要實現InvocationHandler接口,該接口只有一個invoke()方法。


CGLIB是通過生成java 字節碼從而動態的產生代理對象,因此需要字節碼解析處理的依賴asm類庫,字節碼動態生成的代理對象實際上是繼承了真實主題類的。這種實現方式需要導入cglib和asm的類庫。下面用到的例子是cglib-2.2.2.jar,?asm-3.3.1.jar。cglib使用了MethodInterceptor,其中的方法是intercept(),這是攔截的概念,很容易就想到了Struts2的攔截器。

比較之下,Java API提供的動態代理需要面向接口,產生代理對象,因此真實主題實現類必須實現了接口才可以。而CGLIB不需要面向接口,可以代理簡單類,但由于動態代理對象是繼承真實主題實現類的,因此要求真實主題實現類不能是final的。

下面是實現的例子。

首先,為了看到動態代理可以根據不同類動態產生不同代理的效果,我們新建兩個接口,及其實現類。

[java]?view plaincopy
  • package?leon.aj.dynproxy.target;??
  • ??
  • public?interface?Hello?{??
  • ????public?String?sayHello(String?name);??
  • }??
  • 實現類:

    [java]?view plaincopy
  • package?leon.aj.dynproxy.target;??
  • ??
  • public?class?HelloImpl?implements?Hello?{??
  • ????@Override??
  • ????public?String?sayHello(String?name)?{??
  • ????????String?s?=?"Hello,?"+name;??
  • ????????System.out.println(this.getClass().getName()+"->"+s);??
  • ????????return?s;??
  • ????}??
  • }??
  • 另一接口和實現類:

    [java]?view plaincopy
  • package?leon.aj.dynproxy.target;??
  • ??
  • public?interface?UserDao?{??
  • ????public?boolean?login(String?username,String?password);??
  • }??

  • [java]?view plaincopy
  • package?leon.aj.dynproxy.target;??
  • ??
  • public?class?UserDaoImpl?implements?UserDao?{??
  • ????@Override??
  • ????public?boolean?login(String?username,?String?password)?{??
  • ????????String?user?=?"("+username+","+password+")";??
  • ????????System.out.println(this.getClass().getName()+"->?processing?login:"+user);??
  • ????????return?true;??
  • ????}??
  • }??

  • 應用Java API實現的動態代理類:

    [java]?view plaincopy
  • package?leon.aj.dynproxy.java;??
  • ??
  • import?java.lang.reflect.InvocationHandler;??
  • import?java.lang.reflect.Method;??
  • import?java.lang.reflect.Proxy;??
  • ??
  • public?class?JavaDynProxy?implements?InvocationHandler{??
  • ????private?Object?target;??
  • ????public?Object?getProxyInstance(Object?target){??
  • ????????this.target?=?target;??
  • ????????return?Proxy.newProxyInstance(target.getClass().getClassLoader(),???
  • ????????????????target.getClass().getInterfaces(),?this);??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)??
  • ????????????throws?Throwable?{??
  • ????????Object?result?=?null;??
  • ????????System.out.println("before?target?method...");??
  • ????????result?=?method.invoke(target,?args);??
  • ????????System.out.println("after?target?method...");??
  • ????????return?result;??
  • ????}??
  • }??
  • 測試:

    [java]?view plaincopy
  • package?leon.aj.dynproxy.java;??
  • ??
  • import?leon.aj.dynproxy.target.Hello;??
  • import?leon.aj.dynproxy.target.HelloImpl;??
  • import?leon.aj.dynproxy.target.UserDao;??
  • import?leon.aj.dynproxy.target.UserDaoImpl;??
  • ??
  • public?class?TestJavaProxy?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????JavaDynProxy?proxy?=?new?JavaDynProxy();??
  • ????????Hello?hello?=?(Hello)proxy.getProxyInstance(new?HelloImpl());??
  • ????????String?s?=?hello.sayHello("Leon");??
  • ????????System.out.println(s);??
  • ??????????
  • ????????UserDao?userDao?=?(UserDao)?proxy.getProxyInstance(new?UserDaoImpl());??
  • ????????userDao.login("Leon",?"1234");??
  • ????????System.out.println(userDao.getClass().getName());??
  • ????}??
  • }??

  • 下面是采用cglib實現的例子(推薦):

    性能方面看其他文章寫的是cglib要略高一籌,?因為jdk代理大量使用反射的方式。而反射比較耗費性能,cglib就沒有這一個顧慮,他直接就是調用生成的子類的方法。

    [java]?view plaincopy
  • package?leon.aj.dynproxy.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;????
  • ??????
  • ????public?Object?getProxyInstance(Object?target)?{????
  • ????????this.target?=?target;??
  • ????????Enhancer?enhancer?=?new?Enhancer();????
  • ????????enhancer.setSuperclass(this.target.getClass());????
  • ????????enhancer.setCallback(this);??//?call?back?method??
  • ????????return?enhancer.create();??//?create?proxy?instance??
  • ????}????
  • ??????
  • ????@Override??
  • ????public?Object?intercept(Object?target,?Method?method,?Object[]?args,?MethodProxy?proxy)?throws?Throwable?{??
  • ????????System.out.println("before?target?method...");??
  • ????????Object?result?=?proxy.invokeSuper(target,?args);??
  • ????????System.out.println("after?target?method...");??
  • ????????return?result;??
  • ????}??
  • }??

  • 測試類:

    [java]?view plaincopy
  • package?leon.aj.dynproxy.cglib;??
  • ??
  • import?leon.aj.dynproxy.target.Hello;??
  • import?leon.aj.dynproxy.target.HelloImpl;??
  • import?leon.aj.dynproxy.target.UserDaoImpl;??
  • ??
  • public?class?TestCiglib?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????CglibProxy?proxy?=?new?CglibProxy();??
  • ????????Hello?hello?=?(Hello)?proxy.getProxyInstance(new?HelloImpl());??
  • ????????System.out.println(hello.sayHello("Leon"));??
  • ????????UserDaoImpl?userDao?=?(UserDaoImpl)?proxy.getProxyInstance(new?UserDaoImpl());??
  • ????????userDao.login("Leon",?"1234");??
  • ????????System.out.println(userDao.getClass().getSuperclass());//看動態代理實例的父類??
  • ????}??
  • }??


  • 總結

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

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

    主站蜘蛛池模板: 正在播放欧美 | 久久免费看视频 | 亚洲国产欧美在线人成 | 看全色黄大色黄女片18 | 青青青草国产 | 99精品视频在线免费观看 | 欧美乱淫视频 | 久久理论 | 久久久午夜电影 | 男女羞羞的视频 | 黄色片子网站 | 日韩精品理论 | 国产男女网站 | 熟女少妇一区二区 | 欧美综合视频 | 亚洲黄色影院 | 国产精品自拍一区 | 91偷拍网站 | aaa亚洲 | 亚洲国产成人va在线观看天堂 | 一区精品视频在线观看 | 日本精品少妇 | 深夜福利免费在线观看 | 老司机深夜视频 | 丰满人妻妇伦又伦精品国产 | 成人亚洲网站 | 一级淫片a | 伊人av综合网 | 丝袜国产一区 | 日韩高清精品免费观看 | 韩国美女被c | 91黄色在线观看 | 在线观看中文 | 欧美精品色 | 91视频官网| 精品在线视频一区二区三区 | 黄色小视频在线 | 白石茉莉奈番号 | 啪视频免费 | 久草视频福利在线 | 欧美综合视频在线 | 少妇性xxxxxxxxx色武功 | 侵犯女教师一区二区三区 | 无码人妻丰满熟妇区毛片18 | 久操视频在线观看免费 | 亚洲tv在线观看 | 日韩aⅴ视频 | 欧美骚视频 | 91干网| 国产人伦精品一区二区三区 | 狠狠躁日日躁夜夜躁av | 五月天久久综合 | 午夜免费网址 | 91精品国产综合久久久久 | 亚洲精品中文无码AV在线播放 | 国产美女主播 | 日本黄色三级 | 一区二区免费在线观看 | 欧美视频在线观看视频 | 亚洲乱码一区二区 | 国产精品日韩一区二区 | 亚洲淫视频 | 99r在线视频 | av网站有哪些 | 强侵犯の奶水授乳羞羞漫虐 | 亚洲一级网 | 日韩欧美一区二区视频 | 日本黄色高清 | 91精品国产综合久久久密臀九色 | 91不卡在线| 久久久久99精品国产片 | 国产欧美视频在线观看 | 天天躁日日躁狠狠很躁 | 日日干影院| 日韩欧美一区二区三区免费观看 | 国产999久久久 | 毛片一级视频 | 吻胸摸激情床激烈视频大胸 | 日韩成人在线观看视频 | 中文字幕777| 情欲超| 久久久久久国产精品免费播放 | 天堂在线| 久久久久久久久久久影院 | 亚洲免费专区 | 24小时日本在线www免费的 | 国产精品久久一区二区三区 | 性の欲びの女javhd | 欧美97 | 五月天激情视频在线观看 | 黄色小说在线视频 | av图区| 精品乱子伦 | 欧美福利视频一区二区 | 色综合综合 | 国产美女毛片 | 天天看a| 2019年中文字幕 | 国产a自拍 |