成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

JavaCGLib動(dòng)態(tài)代理機(jī)制(全面解析)

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

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁制作,對(duì)垃圾桶等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專業(yè)seo優(yōu)化優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。

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

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

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

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

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

1、被代理類:

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

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

定義一個(gè)攔截器。在調(diào)用目標(biāo)方法時(shí),CGLib會(huì)回調(diào)MethodInterceptor接口方法攔截,來實(shí)現(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動(dòng)態(tài)生成的代理類實(shí)例,Method為上文中實(shí)體類所調(diào)用的被代理的方法引用,Object[]為參數(shù)值列表,MethodProxy為生成的代理類對(duì)方法的代理引用。

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

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

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

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

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

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

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

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

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

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

查看控制臺(tái)輸出:

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動(dòng)態(tài)代理機(jī)制(全面解析)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站欄目:JavaCGLib動(dòng)態(tài)代理機(jī)制(全面解析)
網(wǎng)頁網(wǎng)址:http://jinyejixie.com/article44/gpsjee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、Google品牌網(wǎng)站建設(shè)、網(wǎng)站策劃網(wǎng)站導(dǎo)航、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司