代理模式()
在以上代码中使用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数据库开发优化指南