java动态生成代码涉及到了字节码操作,通常 java 动态性两种常用的实现方式
1,字节码操作
2,反射。
运行时操作字节码可以实现如下功能
1,动态生成新的类。
2, 动态改变某个类的结构。
字节码操作 通常比反射开销小,性能高。
下面就是利用 javassist 动态生成的一个.class 文件
public static void main(String[] args) throws CannotCompileException, IOException, NotFoundException {
ClassPool pool = ClassPool.getDefault();
CtClass ct
= pool.makeClass("com.test.bean.Emp");
//创建属性
CtField e1
= CtField.make("public int no;",ct);
CtField e2
= CtField.make("public String name;",ct);
ct.addField(e1);
ct.addField(e2);
CtMethod m1 = CtMethod.make("public int getNo(){return no;}", ct);
CtMethod m2 = CtMethod.make("public void setNo(int no){return this.no = no;}", ct);
ct.addMethod(m1);
ct.addMethod(m2);
//添加构造器
CtConstructor constructor
= new CtConstructor(
new CtClass[]{CtClass.intType,pool.get("java.lang.String")},ct);//构造器的参数
constructor.setBody("{this.no = no; this.name=name;}");//构造器的方法体
ct.addConstructor(constructor);//如果不添加构造器 则会生成一个空的构造器
ct.writeFile("E:/JavaFile");//将构造好的类写出来
System.out.println("类生成功");
}
代码生成之后必须使用xjad等反编译工具进行查看
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。