Java编程的动态性,第7部分: 用BCEL设计字节码 - 编程入门网
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. 要计时的方法
清单 2 显示了等同于用 BCEL 进行类操作改变的源代码。这里包装器方法只是保存当前 时间,然后调用改名后的原方法,并在返回调用原方法的结果之前打印时间报告。 清单 2. 在原方法中加入计时
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |