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

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

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

服務(wù)器之家 - 編程語言 - Java教程 - Java動(dòng)態(tài)代理和反射機(jī)制詳解

Java動(dòng)態(tài)代理和反射機(jī)制詳解

2021-07-22 16:31MoreThinking Java教程

這篇文章主要介紹了Java動(dòng)態(tài)代理和反射機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

反射機(jī)制

java語言提供的一種基礎(chǔ)功能,通過反射,我們可以操作這個(gè)類或?qū)ο螅热绔@取這個(gè)類中的方法、屬性和構(gòu)造方法等。

動(dòng)態(tài)代理:分為jdk動(dòng)態(tài)代理、cglib動(dòng)態(tài)代理(spring中的動(dòng)態(tài)代理)。

靜態(tài)代理

預(yù)先(編譯期間)確定了代理者與被代理者之間的關(guān)系,也就是說,若代理類在程序運(yùn)行前就已經(jīng)存在了,這種情況就叫靜態(tài)代理

動(dòng)態(tài)代理

代理類在程序運(yùn)行時(shí)創(chuàng)建的代理方式。也就是說,代理類并不是在java代碼中定義的,而是在運(yùn)行期間根據(jù)我們?cè)趈ava代碼中的“指示”動(dòng)態(tài)生成的。

動(dòng)態(tài)代理比靜態(tài)代理的優(yōu)勢(shì)在于:

動(dòng)態(tài)代理可以很方便的對(duì)代理類的函數(shù)進(jìn)行統(tǒng)一的處理(invoke),而不是修改每個(gè)代理類的函數(shù),更靈活和擴(kuò)展。

 jdk的動(dòng)態(tài)代理(依賴于接口)

  1. 在java的動(dòng)態(tài)代理機(jī)制中,有兩個(gè)重要的類或接口,一個(gè)是invocationhandler接口,另一個(gè)是proxy類。
  2. invocationhandler接口是給動(dòng)態(tài)代理類實(shí)現(xiàn)的,負(fù)責(zé)處理被代理對(duì)象的操作
  3. proxy類是用來創(chuàng)建動(dòng)態(tài)代理類實(shí)例對(duì)象的,只有得到這個(gè)對(duì)象,才能調(diào)用需要代理的方法。
  4. 動(dòng)態(tài)代理的代理類是在靜態(tài)代理類上進(jìn)行修改,將動(dòng)態(tài)代理類實(shí)現(xiàn)invocationhandler接口,重寫invoke方法,invoke方法通過傳入的被代理類方法和參數(shù)來執(zhí)行。

如下實(shí)例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface appservice {
 void createapp(string name);
 void deleteapp(string name);
}
 
//代理類(比如微商代理)
public class appserviceimpl implements appservice{
 
 @override
 public void createapp(string name) {
  system.out.print("app["+name+"] has been created.");
 }
 
 @override
 public void deleteapp(string name) {
  system.out.print("app["+name+"] has been delete.");
 }
}
 
 
import java.lang.reflect.invocationhandler;
import java.lang.reflect.method;
 
public class loggerinterceptor implements invocationhandler {
 private object target; //委托類(被代理類)的實(shí)例,比如廠家
 public loggerinterceptor(object target){
  this.target = target;
 }
 @override
 public object invoke(object proxy, method method, object[] args)throws throwable {
  system.out.println("entered "+target.getclass().getname()+"-"+method.getname()+",with arguments{"+args[0]+"}");
  object result = method.invoke(target, args);
  //調(diào)用目標(biāo)對(duì)象的方法 (調(diào)用廠家的方法(createapp)及參數(shù)(kevin test))
  system.out.println("before return:"+result);
  return result;
 }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.lang.reflect.proxy;
 
public class test {
 
public static void main(string[] args) {
    appservice target = new appserviceimpl();//生成目標(biāo)對(duì)象 (代理類的對(duì)象)
    //接下來創(chuàng)建代理對(duì)象
    appservice proxy = (appservice) proxy.newproxyinstance(
    target.getclass().getclassloader(),
    target.getclass().getinterfaces(), new loggerinterceptor(target));
    proxy.createapp("kevin test1");
    proxy.deleteapp("kevin test2");
  }
 
}
 
/**
* 1、jdk的動(dòng)態(tài)代理實(shí)現(xiàn)方式是依賴于接口的,首先使用接口來定義好操作規(guī)范。
* 2、通過proxy類產(chǎn)生的代理對(duì)象調(diào)用被代理對(duì)象的操作。
* 3、而這個(gè)操作又被分發(fā)給invocationhandler接口的invoke方法具體執(zhí)行
*
* 在java的動(dòng)態(tài)代理機(jī)制中,有兩個(gè)重要的類或接口,一個(gè)是invocationhandler接口、另一個(gè)則是 proxy類,這個(gè)類和接口是實(shí)現(xiàn)我們動(dòng)態(tài)代理所必須用到的。
invocationhandler接口是給動(dòng)態(tài)代理類實(shí)現(xiàn)的,負(fù)責(zé)處理被代理對(duì)象的操作的,而proxy是用來創(chuàng)建動(dòng)態(tài)代理類實(shí)例對(duì)象的,因?yàn)橹挥械玫搅诉@個(gè)對(duì)象我們才能調(diào)用那些需要代理的方法。
*
* 此方法的參數(shù)含義如下
proxy:代表動(dòng)態(tài)代理對(duì)象
method:代表正在執(zhí)行的方法
args:代表當(dāng)前執(zhí)行方法傳入的實(shí)參
返回值:表示當(dāng)前執(zhí)行方法的返回值
*
* 如上:
* 使用了proxy類的newproxyinstance方法生成代理對(duì)象,然后用這個(gè)對(duì)象去調(diào)用createapp()和deleteapp()方法,
* 其實(shí)系統(tǒng)會(huì)將這2個(gè)方法分發(fā)給invoke()方法區(qū)執(zhí)行。其中proxy對(duì)象的類是系統(tǒng)幫我們動(dòng)態(tài)創(chuàng)建了,其實(shí)實(shí)現(xiàn)了我們的業(yè)務(wù)接口appservice
*
*/

cglib動(dòng)態(tài)代理(繼承方式)

cglib動(dòng)態(tài)代理中使用methodinterceptor來實(shí)現(xiàn)動(dòng)態(tài)代理類。

攔截器methodinterceptor中就是由methodproxy的invoksuper方法調(diào)用代理方法的。

methodproxy類生成代理方法和代理方法的簽名。

jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理的區(qū)別:

  1. jdk動(dòng)態(tài)代理是實(shí)現(xiàn)了被代理對(duì)象的接口,cglib是繼承了被代理對(duì)象。
  2. cglib因?yàn)槭抢^承機(jī)制,所以無法代理被final修飾的方法。
  3. jdk和cglib都是在運(yùn)行期間生產(chǎn)字節(jié)碼,jdk是直接寫class字節(jié)碼,cglib使用asm框架寫class字節(jié)碼;cglib代理實(shí)現(xiàn)更復(fù)雜,生成代理類比jdk效率低。
  4. jdk調(diào)用代理方法,是通過反射實(shí)現(xiàn)機(jī)制調(diào)用,cglib是通過fashclass機(jī)制直接調(diào)用方法,效率更高。

 fastcalss機(jī)制:

為代理類和被代理類個(gè)生成一個(gè)class,這個(gè)class會(huì)為代理類或被代理類的方法分配一個(gè)index。

這個(gè)index當(dāng)做一個(gè)入?yún)?,fashclass就可以直接定位要調(diào)用的方法,并直接進(jìn)行調(diào)用。這樣省去了反射調(diào)用,所以效率高。

以上所述是小編給大家介紹的java動(dòng)態(tài)代理和反射機(jī)制詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

原文鏈接:https://www.cnblogs.com/MoreThinking/p/10310251.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女又爽又黄免费 | 欧美男男gaygayxxx | 校花被老头夺去第一次动图 | 亚洲黄色色图 | 麻豆在线md0087免费 | 久久草福利自拍视频在线观看 | 青青草国产一区二区三区 | 免费视频网 | freexxx性欧美3d动漫 | 欧美大片一区 | 91天堂一区二区 | 18国产精品白浆在线观看免费 | 91日本在线观看亚洲精品 | 久久成人精品免费播放 | 饭冈加奈子黑人解禁在线播放 | 国产免费看片 | 久久 这里只精品 免费 | 搞逼综合网 | a级毛片毛片免费很很综合 a级黄色视屏 | 国产精品香蕉一区二区三区 | 五月婷婷在线播放 | 日韩大片免费观看 | 北条麻妃黑人正在播放 | 人人人人看人人人做人人 | 日本高清免费中文字幕不卡 | 国产精品香蕉一区二区三区 | 单身男女韩剧在线看 | 亚洲精品久久久成人 | 男女拍拍拍免费视频网站 | 白丝校花好湿好紧 | 日本妇人成熟免费不卡片 | 成人福利免费在线观看 | 99热人人 | 好逼天天有 | 91亚洲精品久久91综合 | 国产福利一区二区在线精品 | 亚洲激情一区 | 精品高潮呻吟99AV无码 | 亚洲午夜精品久久久久 | 四虎黄色影视库 | 国产精品日韩在线观看 |