快速业务通道

Java编程的动态性,第7部分: 用BCEL设计字节码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
org.apache.bcel.generic.ClassGen 是创建新类的起点。它还用于修改现有的类——为了处 理这种情况,有一个以 JavaClass 实例为参数的构造函数,并用它初始化 ClassGen 类信息 。修改了类以后,可以通过调用一个返回 JavaClass 的方法从 ClassGen 实例得到可使用的 类表示,它又可以转换为一个二进制类表示。

听起来有些乱?我想是的。事实上,在两个包之间来回转是使用 BCEL 的一个最主要的缺 点。重复的类结构总有些碍手碍脚,所以如果频繁使用 BCEL,那么可能需要编写一个包装器 类,它可以隐藏其中一些不同之处。在本文中,我将主要使用 org.apache.bcel.generic 包 类,并避免使用包装器。不过在您自己进行开发时要记住这一点。

除了 ClassGen , org.apache.bcel.generic 包还定义了管理不同类组件的结构的类。 这些结构类包括用于处理常量池的 ConstantPoolGen 、用于字段和方法的 FieldGen 和 MethodGen 和处理一系列 JVM 指令的 InstructionList 。最后, org.apache.bcel.generic 包还定义了表示每一种类型的 JVM 指令的类。可以直接创建这些 类的实例,或者在某些情况下使用 org.apache.bcel.generic.InstructionFactory helper 类。使用 InstructionFactory 的好处是它处理了许多指令构建的簿记细节(包括根据指令 的需要在常量池中添加项)。在下面一节您将会看到如何使所有这些类协同工作。

用 BCEL 进行类操作

作为使用 BCEl 的一个例子,我将使用 第 4 部分中的一个 Javassist 例子——测量执 行一个方法的时间。我甚至采用了与使用 Javassist 时的相同方式:用一个改过的名字创建 要计时的原方法的一个副本,然后,通过调用改名后的方法,利用包装了时间计算的代码来 替换原方法的主体。

Java编程的动态性,第7部分: 用BCEL设计字节码(2)

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

选择一个试验品

清单 1 给出了一个用于展示目的示例方法: StringBuilder 类的 buildString 方法。 正如我在 第 4 部分所说的,这个方法采用了所有 Java 性能专家告诫您 不要 使用的方式 来构建一个 String —— 它重复地在字符串的未尾附加单个字符以创建更长的字符串。因为 字符串是不可变的,所以这种方式意味着每次循环时会构建一个新的字符串,从老的字符串 拷贝数据并在最后增加一个字符。总的效果就是用这个方法创建更长的字符串时,它会产生 越来越大的开销。

清单 1. 要计时的方法

public class StringBuilder {    private String buildString(int length) {      String result = "";      for (int i = 0; i < length; i++) {        result += (char)(i%26 + ''a'');      }      return result;    }    public static void main(String[] argv) {      StringBuilder inst = new StringBuilder();      for (int i = 0; i < argv.length; i++) {        String result = inst.buildString(Integer.parseInt(argv [i]));        System.out.println("Constructed string of length " +          result.length());      }    } }

清单 2 显示了等同于用 BCEL 进行类操作改变的源代码。这里包装器方法只是保存当前 时间,然后调用改名后的原方法,并在返回调用原方法的结果之前打印时间报告。

清单 2. 在原方法中加入计时

public class StringBuilder {    private String buildString$impl(int length) {      String result = "";      for (int i = 0; i < length; i++) 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号