Java动态性-字节码操作

原文链接: https://my.oschina.net/u/4094176/blog/3025184

1.实现功能

--字节码操作就是操作JVM中加载好后的字节码

--动态生成新的类

--动态改变某个类的结构(添加删除修改 属性/方法)

2.Javassist

主要由CtClass,CtMethod,CtField组成。

简单使用:

1.创建一个新的类

2.使用XIAD反编译工具,将生成的class文件反编译成java文件

3.实例

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
  
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);
 
//添加构造器
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("生成类,成功!");
}
}

 

转载于:https://my.oschina.net/u/4094176/blog/3025184

你可能感兴趣的:(Java动态性-字节码操作)