Javassist (一)---------------生成新类的字节码

首先需要下载javassist.jar 包,导入到工程中
右击->build path->Configue build path->Libraries->add external JARS->找到jar所在的位置


利用Javassist创建新类

import java.io.IOException;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.NotFoundException;

public class Demo01 {
public static void main(String[] args) throws Exception, IOException {
//获得类池
ClassPool pool=ClassPool.getDefault();
//从类池中创建类
CtClass emp=pool.makeClass("xidian.lili.test.javassist.CtEmp");
//给类创建属性
CtField f1=CtField.make("private int no;", emp);
CtField f2=CtField.make("private String name;", emp);
//给类添加属性
emp.addField(f1);
emp.addField(f2);
//给类创建方法
CtMethod m1=CtMethod.make("public void setNo(int no){this.no=no;}", emp);
CtMethod m2=CtMethod.make("public int getNo(int no){return this.no;}", emp);
//给类添加方法
emp.addMethod(m1);
emp.addMethod(m2);
//给类创建带参构造器
//CtClass.intType CtClass下只有基本数据类型,如果有参数为引用类型 借助pool.get("引用类型")
CtConstructor constructor1=new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, emp);
//构造器方法体
constructor1.setBody("{this.no=no;this.name=name;}");
//给类创建无参构造器
CtConstructor constructor2=new CtConstructor(new CtClass[]{}, emp);
//构造器方法体
constructor2.setBody("{}");
//添加构造方法
emp.addConstructor(constructor2);
emp.addConstructor(constructor1);

//以上类构造在了内存中,我们需要写到本地的工作空间中
emp.writeFile("D:/martin/workspace/TestJavassist/bin/");
System.out.println("生成类成功");
}


}

猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/80976757