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

Java動態(tài)代理和反射機制詳解

 更新時間:2019年03月19日 11:12:36   作者:MoreThinking  
這篇文章主要介紹了Java動態(tài)代理和反射機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

反射機制

Java語言提供的一種基礎功能,通過反射,我們可以操作這個類或對象,比如獲取這個類中的方法、屬性和構造方法等。

動態(tài)代理:分為JDK動態(tài)代理、cglib動態(tài)代理(spring中的動態(tài)代理)。

靜態(tài)代理

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

動態(tài)代理

代理類在程序運行時創(chuàng)建的代理方式。也就是說,代理類并不是在Java代碼中定義的,而是在運行期間根據(jù)我們在Java代碼中的“指示”動態(tài)生成的。

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

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

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

  1. 在Java的動態(tài)代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口,另一個是Proxy類。
  2. InvocationHandler接口是給動態(tài)代理類實現(xiàn)的,負責處理被代理對象的操作
  3. Proxy類是用來創(chuàng)建動態(tài)代理類實例對象的,只有得到這個對象,才能調用需要代理的方法。
  4. 動態(tài)代理的代理類是在靜態(tài)代理類上進行修改,將動態(tài)代理類實現(xiàn)InvocationHandler接口,重寫Invoke方法,Invoke方法通過傳入的被代理類方法和參數(shù)來執(zhí)行。

如下實例:

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; //委托類(被代理類)的實例,比如廠家
 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);
  //調用目標對象的方法 (調用廠家的方法(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();//生成目標對象 (代理類的對象)
    //接下來創(chuàng)建代理對象
    AppService proxy = (AppService) Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), new LoggerInterceptor(target));
    proxy.createApp("Kevin Test1");
    proxy.deleteApp("Kevin Test2");
  }
 
}
 
/**
* 1、jdk的動態(tài)代理實現(xiàn)方式是依賴于接口的,首先使用接口來定義好操作規(guī)范。
* 2、通過proxy類產(chǎn)生的代理對象調用被代理對象的操作。
* 3、而這個操作又被分發(fā)給InvocationHandler接口的invoke方法具體執(zhí)行
*
* 在java的動態(tài)代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口、另一個則是 Proxy類,這個類和接口是實現(xiàn)我們動態(tài)代理所必須用到的。
InvocationHandler接口是給動態(tài)代理類實現(xiàn)的,負責處理被代理對象的操作的,而Proxy是用來創(chuàng)建動態(tài)代理類實例對象的,因為只有得到了這個對象我們才能調用那些需要代理的方法。
*
* 此方法的參數(shù)含義如下
proxy:代表動態(tài)代理對象
method:代表正在執(zhí)行的方法
args:代表當前執(zhí)行方法傳入的實參
返回值:表示當前執(zhí)行方法的返回值
*
* 如上:
* 使用了Proxy類的newProxyInstance方法生成代理對象,然后用這個對象去調用createApp()和deleteApp()方法,
* 其實系統(tǒng)會將這2個方法分發(fā)給invoke()方法區(qū)執(zhí)行。其中proxy對象的類是系統(tǒng)幫我們動態(tài)創(chuàng)建了,其實實現(xiàn)了我們的業(yè)務接口AppService
*
*/

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

cglib動態(tài)代理中使用MethodInterceptor來實現(xiàn)動態(tài)代理類。

攔截器MethodInterceptor中就是由MethodProxy的InvokSuper方法調用代理方法的。

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

JDK動態(tài)代理和Cglib動態(tài)代理的區(qū)別:

  1. JDK動態(tài)代理是實現(xiàn)了被代理對象的接口,Cglib是繼承了被代理對象。
  2. Cglib因為是繼承機制,所以無法代理被final修飾的方法。
  3. JDK和Cglib都是在運行期間生產(chǎn)字節(jié)碼,JDK是直接寫class字節(jié)碼,Cglib使用ASM框架寫class字節(jié)碼;cglib代理實現(xiàn)更復雜,生成代理類比JDK效率低。
  4. JDK調用代理方法,是通過反射實現(xiàn)機制調用,cglib是通過Fashclass機制直接調用方法,效率更高。

 Fastcalss機制:

為代理類和被代理類個生成一個class,這個class會為代理類或被代理類的方法分配一個index。

這個index當做一個入?yún)ⅲ現(xiàn)ashclass就可以直接定位要調用的方法,并直接進行調用。這樣省去了反射調用,所以效率高。

以上所述是小編給大家介紹的Java動態(tài)代理和反射機制詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例

    SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例

    這篇文章主要介紹了SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • MyBatis SELECT基本查詢實現(xiàn)方法詳解

    MyBatis SELECT基本查詢實現(xiàn)方法詳解

    這篇文章主要介紹了MyBatis SELECT基本查詢實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 可觀測性-Metrics-數(shù)據(jù)庫連接池HikariCP監(jiān)控教程

    可觀測性-Metrics-數(shù)據(jù)庫連接池HikariCP監(jiān)控教程

    這篇文章主要介紹了可觀測性-Metrics-數(shù)據(jù)庫連接池HikariCP監(jiān)控教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java注解中@Component和@Bean的區(qū)別

    Java注解中@Component和@Bean的區(qū)別

    這篇文章主要介紹了@Component和@Bean的區(qū)別,在這給大家簡單介紹下作用對象不同:@Component 注解作用于類,而 @Bean 注解作用于方法,具體實例代碼參考下本文
    2024-03-03
  • 微服務Springcloud之Feign的基本使用

    微服務Springcloud之Feign的基本使用

    這篇文章主要介紹了微服務Springcloud之Feign的基本使用,Spring?Cloud集成Feign并對其進行了增強,使Feign支持了Spring?MVC注解,需要的朋友可以參考下
    2023-03-03
  • 走進SpringBoot之配置文件與多環(huán)境詳解

    走進SpringBoot之配置文件與多環(huán)境詳解

    這篇文章主要介紹了走進SpringBoot之配置文件與多環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Maven全局動態(tài)統(tǒng)一控制版本號的實現(xiàn)示例

    Maven全局動態(tài)統(tǒng)一控制版本號的實現(xiàn)示例

    本文介紹使用Maven Versions插件動態(tài)控制項目版本號和依賴組件版本號,實現(xiàn)無需修改代碼即可靈活配置版本信息,提升項目管理和部署效率
    2025-09-09
  • 淺談Springboot2.0防止XSS攻擊的幾種方式

    淺談Springboot2.0防止XSS攻擊的幾種方式

    本文主要介紹了Springboot2.0防止XSS攻擊的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java?對象深拷貝工具類的實現(xiàn)

    Java?對象深拷貝工具類的實現(xiàn)

    本文主要介紹了Java?對象深拷貝工具類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Spring?異步接口返回結果的四種方式

    Spring?異步接口返回結果的四種方式

    這篇文章主要介紹了Spring?異步接口返回結果的四種方式,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08

最新評論

蚌埠市| 明溪县| 鲁甸县| 封丘县| 新田县| 广西| 兰考县| 九龙县| 东丽区| 阿巴嘎旗| 密云县| 南汇区| 诸城市| 驻马店市| 彭州市| 怀化市| 阿拉善右旗| 什邡市| 军事| 宝坻区| 哈巴河县| 荆州市| 南安市| 广南县| 射阳县| 册亨县| 韩城市| 全州县| 淳安县| 固始县| 阿鲁科尔沁旗| 威信县| 滦平县| 普安县| 客服| 梁平县| 房产| 长岭县| 秦安县| 平舆县| 商水县|