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

實(shí)例講解Java中動(dòng)態(tài)代理和反射機(jī)制

 更新時(shí)間:2019年01月24日 14:19:37   投稿:laozhang  
在本篇文章里小編給各位分享了關(guān)于Java中動(dòng)態(tài)代理和反射機(jī)制的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們學(xué)習(xí)下。

反射機(jī)制

Java語(yǔ)言提供的一種基礎(chǔ)功能,通過(guò)反射,我們可以操作這個(gè)類(lèi)或?qū)ο?,比如獲取這個(gè)類(lèi)中的方法、屬性和構(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)系,也就是說(shuō),若代理類(lèi)在程序運(yùn)行前就已經(jīng)存在了,這種情況就叫靜態(tài)代理

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

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

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

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

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

在Java的動(dòng)態(tài)代理機(jī)制中,有兩個(gè)重要的類(lèi)或接口,一個(gè)是InvocationHandler接口,另一個(gè)是Proxy類(lèi)。

InvocationHandler接口是給動(dòng)態(tài)代理類(lèi)實(shí)現(xiàn)的,負(fù)責(zé)處理被代理對(duì)象的操作

Proxy類(lèi)是用來(lái)創(chuàng)建動(dòng)態(tài)代理類(lèi)實(shí)例對(duì)象的,只有得到這個(gè)對(duì)象,才能調(diào)用需要代理的方法。

動(dòng)態(tài)代理的代理類(lèi)是在靜態(tài)代理類(lèi)上進(jìn)行修改,將動(dòng)態(tài)代理類(lèi)實(shí)現(xiàn)InvocationHandler接口,JAVA電子書(shū)重寫(xiě)Invoke方法,Invoke方法通過(guò)傳入的被代理類(lèi)方法和參數(shù)來(lái)執(zhí)行。

如下實(shí)例:

public interface AppService {
 void createApp(String name);
 void deleteApp(String name);
}
//代理類(lèi)(比如微商代理)
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; //委托類(lèi)(被代理類(lèi))的實(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; 
 }
 
}
import java.lang.reflect.Proxy;
 
public class test {
 
public static void main(String[] args) {
    AppService target = new AppServiceImpl();//生成目標(biāo)對(duì)象 (代理類(lèi)的對(duì)象)
    //接下來(lái)創(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)方式是依賴于接口的,首先使用接口來(lái)定義好操作規(guī)范。
* 2、通過(guò)proxy類(lèi)產(chǎn)生的代理對(duì)象調(diào)用被代理對(duì)象的操作。
* 3、而這個(gè)操作又被分發(fā)給InvocationHandler接口的invoke方法具體執(zhí)行
* 
* 在java的動(dòng)態(tài)代理機(jī)制中,有兩個(gè)重要的類(lèi)或接口,一個(gè)是InvocationHandler接口、另一個(gè)則是 Proxy類(lèi),這個(gè)類(lèi)和接口是實(shí)現(xiàn)我們動(dòng)態(tài)代理所必須用到的。
InvocationHandler接口是給動(dòng)態(tài)代理類(lèi)實(shí)現(xiàn)的,負(fù)責(zé)處理被代理對(duì)象的操作的,而Proxy是用來(lái)創(chuàng)建動(dòng)態(tài)代理類(lè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類(lèi)的newProxyInstance方法生成代理對(duì)象,然后用這個(gè)對(duì)象去調(diào)用createApp()和deleteApp()方法,
* 其實(shí)系統(tǒng)會(huì)將這2個(gè)方法分發(fā)給invoke()方法區(qū)執(zhí)行。其中proxy對(duì)象的類(lèi)是系統(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來(lái)實(shí)現(xiàn)動(dòng)態(tài)代理類(lèi)。

攔截器MethodInterceptor中就是由MethodProxy的InvokSuper方法調(diào)用代理方法的。

MethodProxy類(lèi)生成代理方法和代理方法的簽名。

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ī)制,所以無(wú)法代理被final修飾的方法。

3、JDK和Cglib都是在運(yùn)行期間生產(chǎn)字節(jié)碼,JDK是直接寫(xiě)class字節(jié)碼,Cglib使用ASM框架寫(xiě)class字節(jié)碼;cglib代理實(shí)現(xiàn)更復(fù)雜,生成代理類(lèi)比JDK效率低。

4、JDK調(diào)用代理方法,是通過(guò)反射實(shí)現(xiàn)機(jī)制調(diào)用,cglib是通過(guò)Fashclass機(jī)制直接調(diào)用方法,效率更高。

Fastcalss機(jī)制:

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

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

相關(guān)文章

  • 多線程下怎樣保證OkHttpClient的線程安全

    多線程下怎樣保證OkHttpClient的線程安全

    這篇文章主要介紹了多線程下怎樣保證OkHttpClient的線程安全問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java異常之圖書(shū)管理系統(tǒng)

    Java異常之圖書(shū)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java異常之圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • SpringBoot實(shí)現(xiàn)多環(huán)境配置文件切換教程詳解

    SpringBoot實(shí)現(xiàn)多環(huán)境配置文件切換教程詳解

    很多時(shí)候,我們項(xiàng)目在開(kāi)發(fā)環(huán)境和生成環(huán)境的環(huán)境配置是不一樣的,例如,數(shù)據(jù)庫(kù)配置,這個(gè)時(shí)候就需要切換環(huán)境配置文件。本文將詳細(xì)講解SpringBoot如何切換配置文件,需要的可以參考一下
    2022-03-03
  • 詳細(xì)解讀AbstractStringBuilder類(lèi)源碼

    詳細(xì)解讀AbstractStringBuilder類(lèi)源碼

    這篇文章主要介紹了詳細(xì)解讀AbstractStringBuilder類(lèi)源碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • 全解史上最快的JOSN解析庫(kù)alibaba Fastjson

    全解史上最快的JOSN解析庫(kù)alibaba Fastjson

    這篇文章主要介紹了史上最快的JOSN解析庫(kù)alibaba Fastjson,對(duì)FastJson感興趣的同學(xué),一定要看一下
    2021-04-04
  • java并發(fā)JUC工具包AtomicInteger原子整型語(yǔ)法基礎(chǔ)

    java并發(fā)JUC工具包AtomicInteger原子整型語(yǔ)法基礎(chǔ)

    這篇文章主要為大家介紹了java并發(fā)JUC工具包AtomicInteger原子整型語(yǔ)法基礎(chǔ),有需要的朋友可以借鑒參考希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Shiro實(shí)現(xiàn)session限制登錄數(shù)量踢人下線功能

    Shiro實(shí)現(xiàn)session限制登錄數(shù)量踢人下線功能

    這篇文章主要介紹了Shiro實(shí)現(xiàn)session限制登錄數(shù)量踢人下線,本文記錄的是shiro采用session作為登錄方案時(shí),對(duì)用戶進(jìn)行限制數(shù)量登錄,以及剔除下線,需要的朋友可以參考下
    2023-11-11
  • 淺談IDEA中Maven配置問(wèn)題全解決

    淺談IDEA中Maven配置問(wèn)題全解決

    這篇文章主要介紹了淺談IDEA中Maven配置問(wèn)題全解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 在MyBatis中使用<、<=?等特殊符號(hào)詳解

    在MyBatis中使用<、<=?等特殊符號(hào)詳解

    這篇文章主要介紹了在MyBatis中使用<、<=?等特殊符號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • java日志LoggerFactory.getLogger的用法及說(shuō)明

    java日志LoggerFactory.getLogger的用法及說(shuō)明

    這篇文章主要介紹了java日志LoggerFactory.getLogger的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

安宁市| 长沙县| 思南县| 昂仁县| 柳河县| 安阳县| 贡觉县| 河北省| 翼城县| 宜春市| 邵武市| 朝阳县| 太康县| 徐汇区| 高平市| 甘谷县| 黑龙江省| 横山县| 安康市| 惠东县| 伊宁县| 亚东县| 大田县| 蒙自县| 安义县| 德惠市| 来宾市| 泾川县| 武宁县| 阿克苏市| 涿鹿县| 茶陵县| 保定市| 龙山县| 丰原市| 柳州市| 南昌市| 吉水县| 鹤峰县| 四川省| 石屏县|