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

Java CGLib動態(tài)代理機制(全面解析)

 更新時間:2017年08月04日 08:24:37   投稿:jingxian  
下面小編就為大家?guī)硪黄狫ava CGLib動態(tài)代理機制(全面解析)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、首先說一下JDK中的動態(tài)代理:

JDK中的動態(tài)代理是通過反射類Proxy以及InvocationHandler回調接口實現的

但是,JDK中所要進行動態(tài)代理的類必須要實現一個接口,也就是說只能對該類所實現接口中定義的方法進行代理,這在實際編程中具有一定的局限性,而且使用反射的效率也并不是很高。

二、使用CGLib實現:

使用CGLib實現動態(tài)代理,完全不受代理類必須實現接口的限制,而且CGLib底層采用ASM字節(jié)碼生成框架,使用字節(jié)碼技術生成代理類,比使用Java反射效率要高。唯一需要注意的是,CGLib不能對聲明為final的方法進行代理,因為CGLib原理是動態(tài)生成被代理類的子類。

下面,將通過一個實例介紹使用CGLib實現動態(tài)代理。

1、被代理類:

首先,定義一個類,該類沒有實現任何接口,包含兩個方法。

public class ConcreteClassNoInterface { 
 public String getConcreteMethodA(String str){ 
  System.out.println("ConcreteMethod A ... "+str); 
  return str; 
 } 
 public int getConcreteMethodB(int n){ 
  System.out.println("ConcreteMethod B ... "+n); 
  return n+10; 
 } 
}

2、攔截器:

定義一個攔截器。在調用目標方法時,CGLib會回調MethodInterceptor接口方法攔截,來實現你自己的代理邏輯,類似于JDK中的InvocationHandler接口。

public class ConcreteClassInterceptor implements MethodInterceptor{ 
 public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { 
  System.out.println("Before:"+method); 
  Object object=proxy.invokeSuper(obj, arg); 
  System.out.println("After:"+method); 
  return object; 
 } 
} 

參數:Object為由CGLib動態(tài)生成的代理類實例,Method為上文中實體類所調用的被代理的方法引用,Object[]為參數值列表,MethodProxy為生成的代理類對方法的代理引用。

返回:從代理實例的方法調用返回的值。

其中,proxy.invokeSuper(obj,arg):

調用代理類實例上的proxy方法的父類方法(即實體類ConcreteClassNoInterface中對應的方法)

在這個示例中,只在調用被代理類方法前后各打印了一句話,當然實際編程中可以是其它復雜邏輯。

3、生成動態(tài)代理類:

Enhancer enhancer=new Enhancer(); 
enhancer.setSuperclass(ConcreteClassNoInterface.class); 
enhancer.setCallback(new ConcreteClassInterceptor()); 
ConcreteClassNoInterface ccni=(ConcreteClassNoInterface)enhancer.create(); 

這里Enhancer類是CGLib中的一個字節(jié)碼增強器,它可以方便的對你想要處理的類進行擴展,以后會經常看到它。

首先將被代理類ConcreteClassNoInterface設置成父類,然后設置攔截器ConcreteClassInterceptor,最后執(zhí)行enhancer.create()動態(tài)生成一個代理類,并從Object強制轉型成父類型ConcreteClassNoInterface。

最后,在代理類上調用方法:

ccni.getConcreteMethodA("shensy"); 
ccni.getConcreteMethodB(0); 

查看控制臺輸出:

Before :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) 
ConcreteMethod A ... shensy 
After :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) 
Before :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int) 
ConcreteMethod B ... 0 
After :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int) 

可以看到,攔截器在調用被代理類方法前后都執(zhí)行了print操作。

以上這篇Java CGLib動態(tài)代理機制(全面解析)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JAVA Swing實現窗口添加課程信息過程解析

    JAVA Swing實現窗口添加課程信息過程解析

    這篇文章主要介紹了JAVA Swing實現窗口添加課程信息過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • jsp頁面中獲取servlet請求中的參數的辦法詳解

    jsp頁面中獲取servlet請求中的參數的辦法詳解

    在JAVA WEB應用中,如何獲取servlet請求中的參數,本文講解了jsp頁面中獲取servlet請求中的參數的辦法
    2018-03-03
  • Mybatis的核心配置文件使用方法

    Mybatis的核心配置文件使用方法

    Mybatis的核心配置文件有兩個,一個是全局配置文件,它包含了會深深影響Mybatis行為的設置和屬性信息;一個是映射文件,它很簡單,讓用戶能更專注于SQL代碼,本文主要介紹了Mybatis的核心配置文件使用方法,感興趣的可以了解一下
    2023-11-11
  • Java 對稱加密幾種算法分別實現

    Java 對稱加密幾種算法分別實現

    這篇文章主要介紹了Java 對稱加密使用DES / 3DES / AES 這三種算法分別實現的相關資料,這里提供了實例代碼,需要的朋友可以參考下
    2017-01-01
  • 解析SpringBoot自定義參數校驗注解

    解析SpringBoot自定義參數校驗注解

    這篇文章主要介紹了SpringBoot自定義參數校驗注解,引入依賴,spring validation是在hibernate-validator上做了一層封裝,文中提到了定義參數校驗注解與處理器的示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • java調用opencv身份證號識別詳解

    java調用opencv身份證號識別詳解

    這篇文章主要為大家詳細介紹了java如何調用opencv實現身份證號的識別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • java獲取網絡類型的方法

    java獲取網絡類型的方法

    這篇文章主要介紹了java獲取網絡類型的方法,涉及java針對網絡類型的參數獲取及判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Spring mvc整合tiles框架的簡單入門教程(maven)

    Spring mvc整合tiles框架的簡單入門教程(maven)

    這篇文章主要給大家介紹了關于Spring mvc整合tiles框架的簡單入門教程(maven),文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友可以參考借鑒,下面來一起看看詳細的介紹吧。
    2017-12-12
  • MyBatis #{}和${} |與數據庫連接池使用詳解

    MyBatis #{}和${} |與數據庫連接池使用詳解

    本文將為大家說說關于 #{} 和 ${},這個是 MyBatis 在面試中最常問的面試題,以及數據庫連接池相關的知識,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • spring5 SAXParseException:cvc-elt.1: 找不到元素“beans 的聲明詳解

    spring5 SAXParseException:cvc-elt.1: 找不到元素“beans 的聲明詳解

    這篇文章主要給大家介紹了關于spring5 SAXParseException:cvc-elt.1: 找不到元素“beans 聲明的相關資料,需要的朋友可以參考下
    2020-08-08

最新評論

贺州市| 翁牛特旗| 怀安县| 阳春市| 郸城县| 河南省| 剑阁县| 梅河口市| 宜宾县| 铜鼓县| 红河县| 东光县| 建阳市| 平和县| 团风县| 伽师县| 河曲县| 舒兰市| 孝义市| 莫力| 抚宁县| 育儿| 托克逊县| 裕民县| 改则县| 来凤县| 衡东县| 新绛县| 平凉市| 汶川县| 陈巴尔虎旗| 即墨市| 新宾| 大冶市| 虹口区| 岳阳县| 敦化市| 隆子县| 朔州市| 孙吴县| 石门县|