所谓的字节码操作就是操作我们已经加载的字节码
接下来我们重点来讲解javaassist类库
使用需要下载jar包,把jar包添加到对应的工程之后
package com.bjsxt.test; public class Emp { private int empno;
private String ename; public void sayHello(int a){
System.out.println("sayHello,"+a);
} public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
} public Emp(int empno, String ename) {
super();
this.empno = empno;
this.ename = ename;
} public Emp() {
}
}
我们使用javaAssit工具手动的创建一个Emp .class文件
我们来看程序的代码
package com.bjsxt.test; import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod; /**
* 测试使用javassist生成一个新的类
* @author 尚学堂高淇 www.sxt.cn
*
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("com.bjsxt.bean.Emp"); //创建属性
CtField f1 = CtField.make("private int empno;", cc);
CtField f2 = CtField.make("private String ename;", cc);
cc.addField(f1);
cc.addField(f2); //创建方法
CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc);
CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc);
cc.addMethod(m1);
cc.addMethod(m2); //添加构造器
/*
* CtClass.intType,pool.get("java.lang.String 构造函数的int和string类型
*/
CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, cc);
constructor.setBody("{this.empno=empno; this.ename=ename;}");
cc.addConstructor(constructor); cc.writeFile("c:/myjava"); //将上面构造好的类写入到c:/myjava中
System.out.println("生成类,成功!");
}
}
我们运行上面的代码,就在c盘生成了 一个Emp .class文件