代理模式()
以上代码分别生成了种代理并对生成的代理类进行高频率的调用最后输出各个代理类的创建耗时动态类类名和方法调用耗时结果如下
createJdkProxy:
JdkProxy class:$Proxy
callJdkProxy:
createCglibProxy:
CglibProxy class:$javatuningchproxyIDBQuery$$EnhancerByCGLIB$$babbf
callCglibProxy:
createJavassistDynProxy:
JavassistDynProxy class:javatuningchproxyIDBQuery_$$_javassist_
callJavassistDynProxy:
createJavassistBytecodeDynamicProxy:
JavassistBytecodeDynamicProxy class:javatuningchproxyIDBQueryJavaassistBytecodeProxy
callJavassistBytecodeDynamicProxy:
可以看到JDK的动态类创建过程最快这是因为在这个内置实现中defineClass()方法被定义为native实现故性能高于其他几种实现但在代理类的函数调用性能上JDK的动态代理就不如CGLIB和Javassist的基于动态代码的代理而Javassist的基于代理工厂的代理实现代理的性能质量最差甚至不如JDK的实现在实际开发应用中代理类的方法调用频率通常要远远高于代理类的实际生成频率(相同类的重复生成会使用cache)故动态代理对象的方法调用性能应该作为性能的主要关注点
注意就动态代理的方法调用性能而言CGLIB和Javassist的基于动态代码的代理都优于JDK自带的动态代理此外JDK的动态代理要求代理类和真实主题都实现同一个接口而CGLIB和Javassist没有强制要求
Hibernate中代理模式的应用
用代理模式实现延迟加载的一个经典应用就在Hibernate框架中当Hibernate加载实体bean时并不会一次性将数据库所有的数据都装载默认情况下它会采取延迟加载的机制以提高系统的性能Hiberante中的延迟加载主要有两种一是属性的延迟加载二是关联表的延时加载这里以属性的延迟加载为例简单阐述Hibernate是如何使用动态代理的
假定有用户模型
public class User implements javaioSerializable {
private Integer id;
private String name;
private int age;
//省略getter和setter
使用以下代码通过Hibernate加载一条User信息
public static void main(String[] args) throws SecurityException
NoSuchFieldException
IllegalArgumentException
IllegalAccessException {
//从数据库载入ID为的用户
User u=(User)HibernateSessionFactorygetSession()load(Userclass )
//打印类名称
Systemoutprintln(Class Name:+ugetClass()getName())
//打印父类名称
Systemoutprintln(Super Class Name:+ugetClass()getSuperclass()
getName())
//实现的所有接口
Class[] ins=ugetClass()getInterfaces()
for(Class cls:ins){
Systemoutprintln(interface:+clsgetName())
}
Systemoutprintln(ugetName())
}
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南