import javassist.*;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//创建对象
public class TestAssist {
public static void main(String[] args) throws CannotCompileException, IOException, NotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {
// 获取默认的类池
ClassPool pool = ClassPool.getDefault();
// 在类池设置类
CtClass cc = pool.makeClass("com.assist.TestUser");
// 设置 类的属性
CtField name = CtField.make("private String name;",cc);
CtField age = CtField.make("private int age;",cc);
cc.addField(name);
cc.addField(age);
// 设置类的方法
CtMethod setAll = CtMethod.make("public void setName(String name,int age){"
+"this.name = name; this.age = age;}",cc);
CtMethod getName = CtMethod.make("public String getName(){" +
"return this.name;}",cc);
cc.addMethod(setAll);
cc.addMethod(getName);
// 设置类的构造器(两个参数)
CtConstructor constructor = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),CtClass.intType},cc);
// 构造器体,里面的参数用$1,$2代替
constructor.setBody("{this.name = $1;this.age=$2;}");
cc.addConstructor(constructor);
// 保存
cc.writeFile("/Users/lijunfeng/gits/untitled/TestUser");
System.out.println("ok");
// 反射,创建对象
Class clazz = cc.toClass();
Constructor constructor1 = clazz.getConstructor(String.class, int.class);
constructor1.setAccessible(true);
Object obj = constructor1.newInstance(new Object[]{"lijunfeng",50});
Method getNameMethod = clazz.getDeclaredMethod("getName");
System.out.println(getNameMethod.invoke(obj));
Method setName = clazz.getDeclaredMethod("setName",String.class,int.class);
setName.invoke(obj,"majuan",30);
System.out.println(getNameMethod.invoke(obj));
}
}
使用javaassist创建类和对象
最新推荐文章于 2023-02-14 10:29:16 发布