要點:
1、Java動態(tài)性的兩種實現(xiàn)方法(反射和字節(jié)碼操作)
2、操作字節(jié)碼有什么作用
3、API的使用
4谦铃、反編譯軟件XJad的使用
一耘成、Java動態(tài)性的兩種實現(xiàn)方式
- 反射
- 字節(jié)碼操作
二、字節(jié)碼操作簡介
- 在程序運行時驹闰,操作字節(jié)碼可以實現(xiàn)動態(tài)生成新的類瘪菌、動態(tài)改變某個類的結(jié)構(gòu)(添加/刪除/修改 新的屬性/方法)。
- 相比于反射開銷小嘹朗、效率高师妙。
三、實現(xiàn)
import javassist.*;
import java.io.IOException;
/**
* @ClassName Demo01
* @Description 測試Javassist創(chuàng)建一個新的類
* @Author xwd
* @Date 2018/10/23 16:55
*/
public class Demo01 {
public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
//創(chuàng)建類
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("pri.xiaowd.bean.Stu");
//創(chuàng)建屬性并添加
CtField field1 = CtField.make("private int age;",ctClass);
CtField field2 = CtField.make("private String name;",ctClass);
ctClass.addField(field1);
ctClass.addField(field2);
//創(chuàng)建方法并添加
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);
//創(chuàng)建構(gòu)造器并添加
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