快速业务通道

Java编程的动态性,第8部分: 用代码生成取代反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
+ gmeth.getName() +      "_" + smeth.getName();    byte[] bytes = createAccess(HolderBean.class, gmeth, smeth,  cname);    // load and construct an instance of the class    Class clas = s_classLoader.load(cname, bytes);    IAccess access = null;    try {      access = (IAccess)clas.newInstance();    } catch (IllegalAccessException ex) {      ex.printStackTrace(System.err);      System.exit(1);    } catch (InstantiationException ex) {      ex.printStackTrace(System.err);      System.exit(1);    }    System.out.println("Generate and load time of " +      (System.currentTimeMillis()-base) + " ms.");    // run the timing comparison    long start = System.currentTimeMillis();    int result = runReflection(count, gmeth, smeth, bean);    long time = System.currentTimeMillis() - start;    System.out.println("Reflection took " + time +      " ms. with result " + result + " (" + bean.getValue1() +      ", " + bean.getValue2() + ")");    bean.setValue1(0);    bean.setValue2(0);    start = System.currentTimeMillis();    result = runAccess(count, access, bean);    time = System.currentTimeMillis() - start;    System.out.println("Generated took " + time +      " ms. with result " + result + " (" + bean.getValue1() +      ", " + bean.getValue2() + ")"); } /** Simple-minded loader for constructed classes. */ protected static class DirectLoader extends SecureClassLoader {    protected DirectLoader() {      super(TimeCalls.class.getClassLoader());    }    protected Class load(String name, byte[] data) {      return super.defineClass(name, data, 0, data.length);    } }

Java编程的动态性,第8部分: 用代码生成取代反射(5)

时间:2011-04-09 IBM Dennis M. Sosnoski

为了进行简单的计时测试,我调用 run() 方法两次,对于 清单 1 HolderBean 类中的每 个属性调用一次。运行两次测试对于测试的公正性是很重要的 —— 第一次运行代码要装载 所有必要的类,这对于 Javassist 和 BCEL 类生成过程都会增加大量开销。不过,在第二次 运行时不需要这种开销,这样就能更好地估计在实际的系统中使用时,类生成需要多长的时 间。下面是一个执行测试时生成的示例输出:

[dennis]$ java -cp .:bcel.jar BCELCalls 2000 Generate and load time of 409 ms. Reflection took 61 ms. with result 2000 (2000, 0) Generated took 2 ms. with result 2000 (2000, 0) Generate and load time of 1 ms. Reflection took 13 ms. with result 2000 (0, 2000) Generated took 2 ms. with result 2000 (0, 2000)

图 1 显示了用从 2k 到 512k 次循环进行调用时计时测试的结果(在运行 Mandrake Linux 9.1 的 Athlon 2200+ XP 系统上运行测试,使用 Sun 1.4.2 JVM )。这里,我在每 次测试运行中加入了第二个属性的反射时间和生成的代码的时间(这样

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号