知识大全 Java程序性能优化-代理模式(3)
Posted 知
篇首语:我们用人生最好的年华做抵押,去担保一个说出来都会被人嘲笑的梦想。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java程序性能优化-代理模式(3)相关的知识,希望对你有一定的参考价值。
Java程序性能优化-代理模式(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
代理模式( )
动态代理介绍
动态代理是指在运行时 动态生成代理类 即 代理类的字节码将在运行时生成并载入当前的ClassLoader 与静态代理类相比 动态类有诸多好处 首先 不需要为真实主题写一个形式上完全一样的封装类 假如主题接口中的方法很多 为每一个接口写一个代理方法也是非常烦人的事 如果接口有变动 则真实主题和代理类都要修改 不利于系统维护 其次 使用一些动态代理的生成方法甚至可以在运行时指定代理类的执行逻辑 从而大大提升系统的灵活性
注意 动态代理使用字节码动态生成加载技术 在运行时生成并加载类
生成动态代理类的方法很多 如 JDK自带的动态代理 CGLIB Javassist或者ASM库 JDK的动态代理使用简单 它内置在JDK中 因此不需要引入第三方Jar包 但相对功能比较弱 CGLIB和Javassist都是高级的字节码生成库 总体性能比JDK自带的动态代理好 而且功能十分强大 ASM是低级的字节码生成工具 使用ASM已经近乎于在使用Java bytecode编程 对开发人员要求最高 当然 也是性能最好的一种动态代理生成工具 但ASM的使用实在过于繁琐 而且性能也没有数量级的提升 与CGLIB等高级字节码生成工具相比 ASM程序的可维护性也较差 如果不是在对性能有苛刻要求的场合 笔者还是推荐CGLIB或者Javassist
动态代理实现
以上例中的DBQueryProxy为例 使用动态代理生成动态类 替代上例中的DBQueryProxy 首先 使用JDK的动态代理生成代理对象 JDK的动态代理需要实现一个处理方法调用的Handler 用于实现代理方法的内部逻辑
public class JdkDbQeuryHandler implements InvocationHandler
IDBQuery real=null; //主题接口
@Override
public Object invoke(Object proxy Method method Object[] args)
throws Throwable
if(real==null)
real=new DBQuery() //如果是第一次调用 则生成真实对象
return real request() //使用真实主题完成实际的操作
以上代码实现了一个Handler 可以看到 它的内部逻辑和DBQueryProxy是类似的 在调用真实主题的方法前 先尝试生成真实主题对象 接着 需要使用这个Handler生成动态代理对象
public static IDBQuery createJdkProxy()
IDBQuery jdkProxy = (IDBQuery) Proxy newProxyInstance(
ClassLoader getSystemClassLoader()
new Class[] IDBQuery class
new JdkDbQeuryHandler()) //指定Handler
return jdkProxy;
以上代码生成一个实现了IDBQuery接口的代理类 代理类的内部逻辑由JdkDbQeuryHandler决定 生成代理类后 由newProxyInstance()方法返回该代理类的一个实例 至此 一个完整的JDK动态代理就完成了
CGLIB和Javassist的动态代理的使用和JDK的动态代理非常类似 下面 尝试使用CGLIB生成动态代理 CGLIB也需要实现一个处理代理逻辑的切入类
public class CglibDbQueryInterceptor implements MethodInterceptor
IDBQuery real=null;
@Override
public Object intercept(Object arg Method arg Object[] arg
MethodProxy arg ) throws Throwable
if(real==null) //代理类的内部逻辑
//和前文中的一样
real=new DBQuery()
return real request()
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
cha138/Article/program/Java/gj/201311/27832相关参考
Java程序性能优化-代理模式(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java程序性能优化-代理模式(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java程序性能优化-代理模式(4) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java程序性能优化-代理模式(5) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java程序性能优化-代理模式(6) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java程序性能优化-业务代理模式(2)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
Java程序性能优化-业务代理模式(1)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
Java程序性能优化-业务代理模式(1)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这
Java程序性能优化-业务代理模式(2)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! i
Java程序性能优化-单例模式(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!