Javassist 是一个用于处理Java字节码的库。Java 字节码以二进制的形式存储在 class 文件中。每个 class 文件包含一个 Java 类或接口。
class 文件可以用 Javassist.CtClass 类来表示。CtClass对象用于处理 class 文件。以下是一个简单的例子,有两个类,这两个类没有关系,我们修改 Rectangle 使他的父类编程 Point。
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.democome.Rectangle");
cc.setSuperclass(pool.get("com.democome.Point"));
cc.writeFile();
Rectangle.java
public class Rectangle {
private int width;
private int height;
}
Point.java
public class Point {
}
运行之后,用反编译工具可以看一下,继承关系已经改变:
上面的代码首先获得一个 ClassPool。ClassPool 是 CtClass 的容器。它读取 class 文件来构造 CtClass 对象,并记录。要修改 calss,首先要从 ClassPool 通过 get( ) 获取一个 CtClass 对象。
关于实现的原理 ClassPool 中有一个 Hashtable 来存储 CtClass,key 就是类名。ClassPool 的 get( ) 方法如果能找到这个类则直接返回,否则创建一个 CtClass 对象返回,并存到 Hashtable 中。
privateHashtablecflow=null;
CtClass 对象对 class 文件进行修改,并调用 writeFile( ) 写入文件。Javassist 还提供了一种直接获取修改后的字节码的方法ÿ