问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-05-16 21:15

我来回答

1个回答

热心网友 时间:2024-11-30 07:08

    代理模式( )

  在以上代码中 使用CtField make()方法和CtNewMehod make()方法在运行时生成了代理类的字段和方法 这些逻辑由Javassist的CtClass对象处理 将Java代码转换为对应的字节码 并生成动态代理类的实例

  注意 与静态代理相比 动态代理可以很大幅度地减少代码行数 并提升系统的灵活性

  在Java中 动态代理类的生成主要涉及对ClassLoader的使用 这里以CGLIB为例 简要阐述动态类的加载过程 使用CGLIB生成动态代理 首先需要生成Enhancer类实例 并指定用于处理代理业务的回调类 在Enhancer create()方法中 会使用DefaultGeneratorStrategy Generate()方法生成动态代理类的字节码 并保存在byte数组中 接着使用ReflectUtils defineClass()方法 通过反射 调用ClassLoader defineClass()方法 将字节码装载到ClassLoader中 完成类的加载 最后使用ReflectUtils newInstance()方法 通过反射 生成动态类的实例 并返回该实例 无论使用何种方法生成动态代理 虽然实现细节不同 但主要逻辑都如图 所示

  图   实现动态代理的基本步骤

  前文介绍的几种动态代理的生成方法 性能有一定差异 为了能更好地测试它们的性能 去掉DBQuery类中的sleep()代码 并使用以下方法测试

  public static final int CIRCLE= ;

  public static void main(String[] args) throws Exception {

  IDBQuery d=null;

  long begin=System currentTimeMillis()

  d=createJdkProxy()                      //测试JDK动态代理

  System out println( createJdkProxy: +(System currentTimeMillis() beg    in))

  System out println( JdkProxy class: +d getClass() getName())

  begin=System currentTimeMillis()

  for(int i= ;i<CIRCLE;i++)

  d request()

  System out println( callJdkProxy: +(System currentTimeMillis() begin    ))

  begin=System currentTimeMillis()

  d=createCglibProxy()                    //测试CGLIB动态代理

  System out println( createCglibProxy: +(System currentTimeMillis() b    egin))

  System out println( CglibProxy class: +d getClass() getName())

  begin=System currentTimeMillis()

  for(int i= ;i<CIRCLE;i++)

  d request()

  System out println( callCglibProxy: +(System currentTimeMillis() beg    in))

  begin=System currentTimeMillis()

  d=createJavassistDynProxy()             //测试Javaassist动态代理

  System out println( createJavassistDynProxy: +(System currentTimeMil    lis() begin))

  System out println( JavassistDynProxy class: +d getClass() getName())

  begin=System currentTimeMillis()

  for(int i= ;i<CIRCLE;i++)

  d request()

  System out println( callJavassistDynProxy: +(System currentTimeMilli    s() begin))

  begin=System currentTimeMillis()

  d=createJavassistBytecodeDynamicProxy()     //测试Javassist动态代理

  System out println( createJavassistBytecodeDynamicProxy: +(System cu    rrentTimeMillis() begin))

  System out println( JavassistBytecodeDynamicProxy class: +d getClass()

  getName())

  begin=System currentTimeMillis()

  for(int i= ;i<CIRCLE;i++)

  d request()

  System out println( callJavassistBytecodeDynamicProxy: +(System curr    entTimeMillis() begin))

  }

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

  编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

  Visual C++音频/视频技术开发与实战

  Oracle索引技术

lishixin/Article/program/Java/gj/201311/27830
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
青海摇什么时候火的 宋庄镇都有哪些村 唐山多地解除封控管理、静态管理,市民仍需做好哪些防护? 拼多多上面的旗舰店是正品吗 ...尺是20:1的图纸上,应画多少厘米,在比例尺是1:200的图纸上测_百度知... 4x2=8,4x20=8,4x200=800,我发现了:一个因数不变,另外一个因数乘以几,积... 小学三年级数学上册4X2=8,4X20=80,4X200=800我发现:一个因数不变,另... 描写雪的段落优选好句60句 程序员最低学历是多少 电脑不识别独显了怎么办? 高级经济师职场,什么叫大评审 天津职称评审怎么一直显示公示中呢 安徽省正高职场评审增刊上的文章可以吗? 乾隆年间的小银元价值多少钱 小脑瓜银元跟大脑瓜的区别 哪些公司在裁员 程维终于败了,滴滴旗下公司关闭60%的业务 明珠入掌和明珠入拿的区别 大连积分入学是什么意思 赉弼的结构赉弼的结构是什么 ...台币、韩币、日币、美金、英镑、欧元、法币之间的换算是多少... 1元人民币换成多少港币,台币? 晋献公托孤重臣荀息,究竟是舍生取义还是明哲保身? 列举舍身取义的例子 战国时期舍生取义的事例 关于“舍生取义”的事例,并作评价。 怎么查询自己的实名认证了没有? CS里的AMP怎么用? AMP是什么?ADP怎么变成AMP amp怎么溶解于水 胡歌和刘亦菲什么时候拍的阿玛尼 铸铁元宝锅有没有插电的 梭子蟹如何挑选怎样挑选鲜梭子蟹好吃 同舟共济是什么意思?成语出处及详细词语解释 如何清除家具甲醛甲醛去除方法 在我国自然血亲的父母子女是指 公积金和商贷混合贷款怎么还 ...还款的组合贷款可以先还商业贷款吗组合贷款公积金可以还商贷吗_百度... 源清满植物酵素洗衣凝露怎么样 招行日日宝安全吗 招商银行日日宝和余额宝一样吗 招行日日宝和存定期哪个好 招行理财日日宝最低持仓多久 招商银行日日宝存进去的钱会少吗 粉末涂料gsg测试哪些项目 木_子的词语木_子的词语是什么 患子的词语患子的词语是什么 电脑后台快捷键 自助值机切换后台快捷键 王维写的什么诗表达了什么感情?