代理模式()
在以上代碼中使用CtFieldmake()方法和CtNewMehodmake()方法在運行時生成了代理類的字段和方法這些邏輯由Javassist的CtClass對象處理將Java代碼轉換為對應的字節碼並生成動態代理類的實例
注意與靜態代理相比動態代理可以很大幅度地減少代碼行數並提升系統的靈活性
在Java中動態代理類的生成主要涉及對ClassLoader的使用這裡以CGLIB為例簡要闡述動態類的加載過程使用CGLIB生成動態代理首先需要生成Enhancer類實例並指定用於處理代理業務的回調類在Enhancercreate()方法中會使用DefaultGeneratorStrategyGenerate()方法生成動態代理類的字節碼並保存在byte數組中接著使用ReflectUtils defineClass()方法通過反射調用ClassLoaderdefineClass()方法將字節碼裝載到ClassLoader中完成類的加載最後使用ReflectUtilsnewInstance()方法通過反射生成動態類的實例並返回該實例無論使用何種方法生成動態代理雖然實現細節不同但主要邏輯都如圖所示
圖 實現動態代理的基本步驟
前文介紹的幾種動態代理的生成方法性能有一定差異為了能更好地測試它們的性能去掉DBQuery類中的sleep()代碼並使用以下方法測試
public static final int CIRCLE=;
public static void main(String[] args) throws Exception {
IDBQuery d=null;
long begin=SystemcurrentTimeMillis()
d=createJdkProxy() //測試JDK動態代理
Systemoutprintln(createJdkProxy:+(SystemcurrentTimeMillis()beg in))
Systemoutprintln(JdkProxy class:+dgetClass()getName())
begin=SystemcurrentTimeMillis()
for(int i=;i<CIRCLE;i++)
drequest()
Systemoutprintln(callJdkProxy:+(SystemcurrentTimeMillis()begin ))
begin=SystemcurrentTimeMillis()
d=createCglibProxy() //測試CGLIB動態代理
Systemoutprintln(createCglibProxy:+(SystemcurrentTimeMillis()b egin))
Systemoutprintln(CglibProxy class:+dgetClass()getName())
begin=SystemcurrentTimeMillis()
for(int i=;i<CIRCLE;i++)
drequest()
Systemoutprintln(callCglibProxy:+(SystemcurrentTimeMillis()beg in))
begin=SystemcurrentTimeMillis()
d=createJavassistDynProxy() //測試Javaassist動態代理
Systemoutprintln(createJavassistDynProxy:+(SystemcurrentTimeMil lis()begin))
Systemoutprintln(JavassistDynProxy class:+dgetClass()getName())
begin=SystemcurrentTimeMillis()
for(int i=;i<CIRCLE;i++)
drequest()
Systemoutprintln(callJavassistDynProxy:+(SystemcurrentTimeMilli s()begin))
begin=SystemcurrentTimeMillis()
d=createJavassistBytecodeDynamicProxy() //測試Javassist動態代理
Systemoutprintln(createJavassistBytecodeDynamicProxy:+(Systemcu rrentTimeMillis()begin))
Systemoutprintln(JavassistBytecodeDynamicProxy class:+dgetClass()
getName())
begin=SystemcurrentTimeMillis()
for(int i=;i<CIRCLE;i++)
drequest()
Systemoutprintln(callJavassistBytecodeDynamicProxy:+(Systemcurr entTimeMillis()begin))
}
返回目錄Java程序性能優化讓你的Java程序更快更穩定
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
JME移動開發實戰教學視頻
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27830.html