java

位置:IT落伍者 >> java >> 浏览文章

Java程序性能优化-代理模式(6)


发布日期:2021年12月28日
 
Java程序性能优化-代理模式(6)

代理模式(

以上代码分别生成了种代理并对生成的代理类进行高频率的调用最后输出各个代理类的创建耗时动态类类名和方法调用耗时结果如下

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数据库开发优化指南

               

上一篇:Java程序性能优化-代理模式(5)

下一篇:Java程序性能优化-代理模式(7)