要点:
1、Java动态性的两种实现方法(反射和字节码操作)
2、操作字节码有什么作用
3、API的使用
4、反编译软件XJad的使用
一、Java动态性的两种实现方式
- 反射
- 字节码操作
二、字节码操作简介
- 在程序运行时,操作字节码可以实现动态生成新的类、动态改变某个类的结构(添加/删除/修改 新的属性/方法)。
- 相比于反射开销小、效率高。
三、实现
import javassist.*;
import java.io.IOException;
/**
* @ClassName Demo01
* @Description 测试Javassist创建一个新的类
* @Author xwd
* @Date 2018/10/23 16:55
*/
public class Demo01 {
public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
//创建类
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("pri.xiaowd.bean.Stu");
//创建属性并添加
CtField field1 = CtField.make("private int age;",ctClass);
CtField field2 = CtField.make("private String name;",ctClass);
ctClass.addField(field1);
ctClass.addField(field2);
//创建方法并添加
CtMethod method1 = CtMethod.make("public int getAge(){return this.age;}",ctClass);
CtMethod method2 = CtMethod.make("public void setAge(int age){this.age=age;}",ctClass);
ctClass.addMethod(method1);
ctClass.addMethod(method2);
//创建构造器并添加
CtConstructor constructor1 = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")},ctClass);
constructor1.setBody("{this.age=age;this.name=name;}");
ctClass.addConstructor(constructor1);
//写到本地,生成.class文件
ctClass.writeFile("D:/myJava");
}
}
Javassist
通过反编译软件XJad可以获得Stu.class文件的java文件:
Stu.java
网友评论