亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

二、使用CGLib實現(xiàn):

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

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

1、被代理類:

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

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、攔截器:

定義一個攔截器。在調(diào)用目標(biāo)方法時,CGLib會回調(diào)MethodInterceptor接口方法攔截,來實現(xiàn)你自己的代理邏輯,類似于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; 
 } 
} 

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

返回:從代理實例的方法調(diào)用返回的值。

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

調(diào)用代理類實例上的proxy方法的父類方法(即實體類ConcreteClassNoInterface中對應(yīng)的方法)

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

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

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

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

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

最后,在代理類上調(diào)用方法:

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) 

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

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

相關(guān)文章

  • Java超詳細(xì)講解三大特性之一的多態(tài)

    Java超詳細(xì)講解三大特性之一的多態(tài)

    多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定
    2022-05-05
  • Java9中新增的Collector收集器

    Java9中新增的Collector收集器

    這篇文章主要介紹了Java9中新增的Collector收集器,Collector作為收集器,簡單來說就是將數(shù)據(jù)或元素收集到一起,并且flatMapping與收集器結(jié)合使用,通過提供智能元素集合進行分組。下文相關(guān)介紹需要的小伙伴可以參考一下
    2022-06-06
  • springboot如何讀取配置文件(application.yml)中的屬性值

    springboot如何讀取配置文件(application.yml)中的屬性值

    本篇文章主要介紹了springboot如何讀取配置文件(application.yml)中的屬性值,具有一定的參考價值,有興趣的小伙伴可以了解一下
    2017-04-04
  • 使用Pinyin4j進行拼音分詞的方法

    使用Pinyin4j進行拼音分詞的方法

    下面小編就為大家分享一篇使用Pinyin4j進行拼音分詞的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • java基于servlet編寫上傳下載功能 類似文件服務(wù)器

    java基于servlet編寫上傳下載功能 類似文件服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了java基于servlet編寫上傳下載功能,類似文件服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java實現(xiàn)給微信群中定時推送消息

    Java實現(xiàn)給微信群中定時推送消息

    這篇文章主要為大家詳細(xì)介紹了Java如何實現(xiàn)給微信群中定時推送消息的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以了解一下
    2022-12-12
  • java根據(jù)List內(nèi)對象的屬性排序方法

    java根據(jù)List內(nèi)對象的屬性排序方法

    下面小編就為大家分享一篇java根據(jù)List內(nèi)對象的屬性排序方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java使用FTPClient類讀寫FTP

    Java使用FTPClient類讀寫FTP

    這篇文章主要為大家詳細(xì)介紹了Java使用FTPClient類讀寫FTP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng)

    java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 判斷java文件類型TikaToolKit的實例

    判斷java文件類型TikaToolKit的實例

    這篇文章主要介紹了判斷java文件類型TikaToolKit的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論