javassist学习:动态创建二进制Java类二进制字节码并通过反射调用的示例

时间:2021-07-27 17:07:06

示例如下代码:

package com.buaa.javassist;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;

public class Demo03 {

public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();

//创建一个新类
CtClass cc = pool.makeClass("com.buaa.javassist.Person");

//添加两个属性
CtField cf1 = CtField.make("private String name;", cc);
CtField cf2 = CtField.make("private int age;", cc);
cc.addField(cf1);
cc.addField(cf2);

//创建一个方法
CtMethod cm = CtMethod.make("public void fun(){System.out.println(\"Hello Man .\");}", cc);
cc.addMethod(cm);

//创建一个构造器
CtConstructor con = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),CtClass.intType},cc);
con.setBody("{this.name = name;this.age = age;}");
cc.addConstructor(con);

//写入到一个文件中
cc.writeFile("e:/zzzjava");
System.out.println("类创建完成!");
}
}

注意:生成的类可通过反编译工具(如XJad)打开查看。