一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

實戰(zhàn)CGLib系列之proxy篇(一):方法攔截MethodInterceptor

 雪狼11 2014-06-18

本系列文章均整理自我在先前一家公司的CGLib使用總結(jié)和筆記。分享出來,希望對看到的人有所幫助,同時歡迎大家提出寶貴意見大笑。如需轉(zhuǎn)載,請勿修改,且注明作者shensy及出處。

實戰(zhàn)CGLib系列文章

本篇介紹通過MethodInterceptor和Enhancer實現(xiàn)一個動態(tài)代理。

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

JDK中的動態(tài)代理是通過反射類Proxy以及InvocationHandler回調(diào)接口實現(xiàn)的,不了解的同學(xué)請參考我的這篇Blog:Java動態(tài)代理詳解 http://shensy./blog/1698197 

但是,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)任何接口,包含兩個方法。

Java代碼 收藏代碼
  1. public class ConcreteClassNoInterface {  

  2.     public String getConcreteMethodA(String str){  

  3.         System.out.println("ConcreteMethod A ... "+str);  

  4.         return str;  

  5.     }  

  6.     public int getConcreteMethodB(int n){  

  7.         System.out.println("ConcreteMethod B ... "+n);  

  8.         return n+10;  

  9.     }  

  10. }  

2、攔截器

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

Java代碼 收藏代碼
  1. public class ConcreteClassInterceptor implements MethodInterceptor{  

  2.     public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {  

  3.         System.out.println("Before:"+method);    

  4.         Object object=proxy.invokeSuper(obj, arg);  

  5.         System.out.println("After:"+method);   

  6.         return object;  

  7.     }  

  8. }  

參數(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)代理類

Java代碼 收藏代碼
  1. Enhancer enhancer=new Enhancer();  

  2. enhancer.setSuperclass(ConcreteClassNoInterface.class);  

  3. enhancer.setCallback(new ConcreteClassInterceptor());  

  4. 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)用方法:

Java代碼 收藏代碼
  1. ccni.getConcreteMethodA("shensy");  

  2. ccni.getConcreteMethodB(0);  

查看控制臺輸出:

控制臺代碼 收藏代碼
  1. Before :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String)  

  2. ConcreteMethod A ... shensy  

  3. After :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String)  

  4. Before :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int)  

  5. ConcreteMethod B ... 0  

  6. After :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int)  

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

結(jié)束語

以上就是CGLib實現(xiàn)動態(tài)代理的一個示例,本系列后面將繼續(xù)介紹CGLib的強大功能,敬請期待。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲中文字幕乱码亚洲| 99国产一区在线播放| 久久精品欧美一区二区三不卡| 日本欧美一区二区三区在线播| 中文字幕佐山爱一区二区免费| 亚洲一区二区三区有码| 91超频在线视频中文字幕| 久久精品蜜桃一区二区av| 日韩精品区欧美在线一区| 国产欧美一区二区久久| 亚洲欧美视频欧美视频| 国产精品成人又粗又长又爽| 国内外免费在线激情视频| 日韩人妻精品免费一区二区三区| 中文字幕不卡欧美在线| 尹人大香蕉中文在线播放| 91偷拍视频久久精品| 欧美成人欧美一级乱黄| 欧美同性视频免费观看| 国产欧美日韩精品成人专区| 久久碰国产一区二区三区| 尹人大香蕉中文在线播放| 亚洲中文字幕熟女丝袜久久| 欧美胖熟妇一区二区三区| 老司机精品国产在线视频| 初尝人妻少妇中文字幕在线| 久久天堂夜夜一本婷婷| 黑丝国产精品一区二区| 91在线播放在线播放观看| 麻豆tv传媒在线观看| 日本午夜福利视频免费观看| 国产精品成人免费精品自在线观看| 一二区不卡不卡在线观看| 人妻精品一区二区三区视频免精| 国产熟女高清一区二区| 日韩午夜老司机免费视频| 欧美精品久久99九九| 99在线视频精品免费播放| 成人国产激情福利久久| 国产又爽又猛又粗又色对黄| 精品一区二区三区人妻视频|