Javassit 是一个用来操作 Java 字节码的库,通过操作字节码可以实现反射,即在运行时 更改类的实现的能力,而且比起使用反射 API 性能更好
使用
- 首先获取到 class 定义的容器
ClassPool
- 通过
ClassPool
获取已经编译好的类(Compile time class),并给这个类设置一个父类 - 使用 writeFile 将这个类的定义写到磁盘,以便后面使用
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test.Rectangle");
cc.setSuperclass(pool.get("test.Point"));
cc.writeFile();
CtClass 方法
-
加载字节码
byte[] b = cc.toBytecode(); Class clazz = cc.toClass();
-
定义新的类
ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("Point");
-
通过 CtMethod 和 CtField 增加属性和方法
ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("foo"); CtMethod mthd = CtNewMethod.make("public Integer getInteger() { return null; }", cc); cc.addMethod(mthd);CtField f = new CtField(CtClass.intType, "i", cc); point.addField(f);clazz = cc.toClass(); Object instance = class.newInstance();