最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java動態(tài)代理的兩種實(shí)現(xiàn)方式詳解【附相關(guān)jar文件下載】

 更新時間:2019年03月08日 11:21:24   作者:Bug開發(fā)攻城獅  
這篇文章主要介紹了Java動態(tài)代理的兩種實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了java動態(tài)代理的相關(guān)原理、實(shí)現(xiàn)方法與操作技巧,并附帶相關(guān)jar文件供讀者下載,需要的朋友可以參考下

本文實(shí)例講述了Java動態(tài)代理的兩種實(shí)現(xiàn)方式。分享給大家供大家參考,具體如下:

一說到動態(tài)代理,我們第一個想到肯定是大名鼎鼎的Spring AOP了。在AOP的源碼中用到了兩種動態(tài)代理來實(shí)現(xiàn)攔截切入功能:jdk動態(tài)代理和cglib動態(tài)代理。兩種方法同時存在,各有優(yōu)劣。jdk動態(tài)代理是由java內(nèi)部的反射機(jī)制來實(shí)現(xiàn)的,cglib動態(tài)代理是通過繼承來實(shí)現(xiàn)的,底層則是借助asm(Java 字節(jié)碼操控框架)來實(shí)現(xiàn)的(采用字節(jié)碼的方式,給A類創(chuàng)建一個子類B,子類B使用方法攔截的技術(shù)攔截所以父類的方法調(diào)用)??偟膩碚f,反射機(jī)制在生成類的過程中比較高效,而asm在生成類之后的相關(guān)執(zhí)行過程中比較高效(可以通過將asm生成的類進(jìn)行緩存,這樣解決asm生成類過程低效問題)。還有一點(diǎn)必須注意:jdk動態(tài)代理的應(yīng)用前提,必須是目標(biāo)類基于統(tǒng)一的接口。如果沒有上述前提,jdk動態(tài)代理不能應(yīng)用。由此可以看出,jdk動態(tài)代理有一定的局限性,cglib這種第三方類庫實(shí)現(xiàn)的動態(tài)代理應(yīng)用更加廣泛,且在效率上更有優(yōu)勢。。

公用的接口和實(shí)現(xiàn)類

public interface UserService {
  public String getName(int id);
  public Integer getAge(int id);
}
public class UserServiceImpl implements UserService {
  @Override
  public String getName(int id) {
    System.out.println("------getName------");
    return "Tom";
  }
  @Override
  public Integer getAge(int id) {
    System.out.println("------getAge------");
    return 10;
  }
}

JDK的動態(tài)代理實(shí)現(xiàn)

jdk的動態(tài)代理,依賴的是反射包下的invocationHandler接口,我們的代理類實(shí)現(xiàn)invocationHandler,重寫invoke()方法,每當(dāng)我們的代理類調(diào)用方法時,都會默認(rèn)先經(jīng)過invoke()方法。

public class UserInvocationHandler implements InvocationHandler {
  private Object target;
  UserInvocationHandler() {
    super();
  }
  UserInvocationHandler(Object target) {
    super();
    this.target = target;
  }
  @Override
  public Object invoke(Object o, Method method, Object[] args) throws Throwable {
    if("getName".equals(method.getName())){
      System.out.println("++++++before " + method.getName() + "++++++");
      Object result = method.invoke(target, args);
      System.out.println("++++++after " + method.getName() + "++++++");
      return result;
    }else{
      Object result = method.invoke(target, args);
      return result;
    }
  }
}

測試類

public class M {
  public static void main(String[] args) {
    UserService userService = new UserServiceImpl();
    InvocationHandler invocationHandler = new UserInvocationHandler(userService);
    UserService userServiceProxy = (UserService) Proxy.newProxyInstance(
        userService.getClass().getClassLoader(),
        userService.getClass().getInterfaces(),
        invocationHandler);
    System.out.println(userServiceProxy.getName(1));
    System.out.println(userServiceProxy.getAge(1));
  }
}

測試效果

CGLIB的動態(tài)代理實(shí)現(xiàn)

cglib依賴的是cglib包下的methodInterceptor接口,每調(diào)用代理類的方法,都會調(diào)用intercept方法

public class CglibMethodInterceptor implements MethodInterceptor {
  @Override
  public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    System.out.println("------before " + methodProxy.getSuperName() + "------");
    Object o1 = methodProxy.invokeSuper(o, args);
    System.out.println("------after " + methodProxy.getSuperName() + "------");
    return o1;
  }
}

測試類

public class M {
  public static void main(String[] args) {
    CglibMethodInterceptor cglibProxy = new CglibMethodInterceptor();
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(UserServiceImpl.class);
    enhancer.setCallback(cglibProxy);
    UserService o = (UserService) enhancer.create();
    o.getName(1);
    o.getAge(1);
  }
}

測試結(jié)果

ps:cglib的動態(tài)代理,需要cglib.jarasm.jar支持

附:點(diǎn)擊此處本站下載 cglib.jar  asm.jar 。

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 帶你深入了解java-代理機(jī)制

    帶你深入了解java-代理機(jī)制

    Java 有兩種代理方式,一種是靜態(tài)代理,另一種是動態(tài)代理。如果我們在代碼編譯時就確定了被代理的類是哪一個,那么就可以直接使用靜態(tài)代理;如果不能確定,那么可以使用類的動態(tài)加載機(jī)制,在代碼運(yùn)行期間加載被代理的類這就是動態(tài)代理
    2021-08-08
  • 詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例

    詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例

    這篇文章主要介紹了詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例,文中分別介紹了快排時兩種區(qū)間劃分的思路,需要的朋友可以參考下
    2016-04-04
  • SpringBoot+微信小程序?qū)崿F(xiàn)文件上傳與下載功能詳解

    SpringBoot+微信小程序?qū)崿F(xiàn)文件上傳與下載功能詳解

    這篇文章主要為大家介紹了SpringBoot整合微信小程序?qū)崿F(xiàn)文件上傳與下載功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下吧
    2022-03-03
  • Mybatis MapperScannerConfigurer自動掃描Mapper接口生成代理注入到Spring的方法

    Mybatis MapperScannerConfigurer自動掃描Mapper接口生成代理注入到Spring的方法

    這篇文章主要給大家介紹了關(guān)于Mybatis MapperScannerConfigurer自動掃描將Mapper接口生成代理注入到Spring的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2019-03-03
  • java簡單網(wǎng)頁抓取的實(shí)現(xiàn)方法

    java簡單網(wǎng)頁抓取的實(shí)現(xiàn)方法

    這篇文章主要介紹了java簡單網(wǎng)頁抓取的實(shí)現(xiàn)方法,詳細(xì)分析了與Java網(wǎng)頁抓取相關(guān)的tcp及URL相關(guān)概念,以及對應(yīng)的類文件原理,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • Java swing五子棋的實(shí)現(xiàn)方法

    Java swing五子棋的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Java swing五子棋的實(shí)現(xiàn)方法,Java開發(fā)圖形界面程序五子棋的實(shí)現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java?EasyExcel導(dǎo)入帶圖片的完整過程記錄

    Java?EasyExcel導(dǎo)入帶圖片的完整過程記錄

    這篇文章主要介紹了關(guān)于結(jié)合EasyExcel和ApachePOI來實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入并讀取圖片的過程,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Spring+Junit4進(jìn)行接口測試實(shí)例代碼

    Spring+Junit4進(jìn)行接口測試實(shí)例代碼

    這篇文章主要介紹了Spring+Junit4進(jìn)行接口測試實(shí)例代碼,涉及pom.xml、bean的配置,以及接口測試代碼等相關(guān)內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • java實(shí)現(xiàn)五子棋大戰(zhàn)

    java實(shí)現(xiàn)五子棋大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)五子棋大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • ?java中Thread.sleep()的具體使用

    ?java中Thread.sleep()的具體使用

    本文主要介紹了?java中Thread.sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

凤城市| 修武县| 阜新| 赣榆县| 台中市| 荥阳市| 合川市| 高台县| 合江县| 崇义县| 怀远县| 张家界市| 滨海县| 拉萨市| 浙江省| 酒泉市| 贵港市| 博爱县| 五大连池市| 双鸭山市| 新竹县| 华蓥市| 蒲江县| 仪陇县| 沙河市| 梧州市| 阿拉善左旗| 海原县| 南部县| 定襄县| 沙洋县| 阿克| 陇川县| 乌拉特后旗| 景德镇市| 九龙城区| 扬州市| 景德镇市| 八宿县| 陈巴尔虎旗| 广宗县|