Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码
2010-03-18 00:00:00 来源:WEB开发网与 Javassist 一样, BCEL 在类分析方面的功能基本上与 Java 平台通过 Relfection API 直接提供的功能是重复的。这种重复对于类操作工具箱来说是必要的,因为一般不希望在所要操作的类被修改 之前就装载它们。
BCEL 在 org.apache.bcel 包中提供了一些基本常量定义,但是除了这些定义,所有分析相关的代码都在 org.apache.bcel.classfile 包中。这个包中的起点是 JavaClass 类。这个类在用 BCEL 访问类信息时起的作用与使用常规 Java 反射时, java.lang.Class 的作用一样。 JavaClass 定义了得到这个类的字段和方法信息,以及关于父类和接口的结构信息的方法。 与 java.lang.Class 不同,JavaClass 还提供了对类的内部信息的访问,包括常量池和属性,以及作为字节流的完整二进制类表示。
JavaClass 实例通常是通过解析实际的二进制类创建的。BCEL 提供了 org.apache.bcel.Repository 类用于处理解析。在默认情况下,BCEL 解析并缓冲在 JVM 类路径中找到的类表示,从 org.apache.bcel.util.Repository 实例中得到实际的二进制类表示(注意包名的不同)。 org.apache.bcel.util.Repository 实际上是二进制类表示的源代码的接口。在默认源代码中使用类路径的地方,可以用查询类文件的其他路径或者其他访问类信息的方法替换。
改变类
除了对类组件的反射形式的访问, org.apache.bcel.classfile.JavaClass 还提供了改变类的方法。可以用这些方法将任何组件设置为新值。不过一般不直接使用它们,因为包中的其他类不以任何合理的方式支持构建新版本的组件。相反,在 org.apache.bcel.generic 包中有完全单独的一组类,它提供了 org.apache.bcel.classfile 类所表示的同一组件的可编辑版本。
更多精彩
赞助商链接