一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java動態(tài)代理的兩種實(shí)現(xiàn)方式詳解【附相關(guān)jar文件下載】

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

2021-07-19 09:22Bug開發(fā)攻城獅 Java教程

這篇文章主要介紹了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)代理,我們第一個(gè)想到肯定是大名鼎鼎的spring aop了。在aop的源碼中用到了兩種動態(tài)代理來實(shí)現(xiàn)攔截切入功能:jdk動態(tài)代理和cglib動態(tài)代理。兩種方法同時(shí)存在,各有優(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)建一個(gè)子類b,子類b使用方法攔截的技術(shù)攔截所以父類的方法調(diào)用)。總的來說,反射機(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)類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)用方法時(shí),都會默認(rèn)先經(jīng)過invoke()方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
    }
  }
}

測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
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));
  }
}

測試效果

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

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

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

?
1
2
3
4
5
6
7
8
9
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;
  }
}

測試類

?
1
2
3
4
5
6
7
8
9
10
11
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é)果

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

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

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

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

原文鏈接:https://blog.csdn.net/zy_281870667/article/details/53216776

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品自在自线观看 | 手机看片国产自拍 | 日本不卡不码高清免费观看 | 人与动人物人a级特片 | 亚洲国产成人久久综合一 | 亚洲天堂在线视频观看 | 久久久久国产一级毛片高清片 | 亚洲免费在线观看视频 | 青青青在线视频播放 | 美国大片成人性网 | 亚洲高清在线视频 | 四虎综合九九色九九综合色 | 国产精品秒播无毒不卡 | 色婷婷综合和线在线 | 秋霞一级成人欧美理论 | 被黑人同学彻底征服全文小说阅读 | 91九色最新地址 | 51国产午夜精品免费视频 | 久久国内精品 | 免费老外的毛片清高 | 精品久久久噜噜噜久久7 | 99热这里只有精品久久免费 | 久久re这里精品在线视频7 | 97伊人久久精品亚洲午夜 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 深夜影院a | 母爱成瘾在线观看 | 亚洲精品在线网址 | 小便japanesewctv| 久久国产精品永久免费网站 | 四虎永久在线精品国产 | 大桥未久midd—962在线 | 天天干夜夜玩 | 国产一精品一av一免费爽爽 | 国产主播精品在线 | 日韩一本在线 | 国内精品在线观看视频 | 草莓永久地域网名入2022 | 欧美日韩国产一区二区三区不卡 | 911亚洲精品国内自产 | 好大好深好涨好烫还要 |