40、使用javassit操作运行时字节码文件
生活随笔
收集整理的這篇文章主要介紹了
40、使用javassit操作运行时字节码文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、是什么
Javassit是一個功能包,作用類似于java的反射,用于操作運行時字節碼文件,實現動態編程,但性能高于反射。
2、怎么用?
首先需要獲取存放class文件的容器ClassPool,根據全類名獲取一個CtClass對象,根據需要修改這個CtClass對象,如果.class文件已經被JVM加載了,則需要先調用ctClass.stopPruning(true),最后使用字節流將CtClass對象生成的字節數組寫到對應的.class文件
3、代碼實例
public void test_1(){ ClassPool pool = ClassPool.getDefault();CtClass ctClass = pool.makeClass("com.czp.CtClassTest");ctClass.stopPruning(true);try { //自定義屬性ctClass.addField(CtField.make("private int age;", ctClass)); ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}", ctClass));ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass)); //獲取字節數組寫入到指定文件byte[] byteArray = ctClass.toBytecode();FileOutputStream output = new FileOutputStream("F://czp/CtClassTest.class ");output.write(byteArray); output.close();if(ctClass.isFrozen()){//如果class文件被凍結,已經被jvm加載ctClass.defrost();//解凍}//在class Pool中獲取到對應.class文件ctClass = pool.get("com.czp.CtClassTest ");//同上ctClass.addField(CtField.make("private String sex;", ctClass));ctClass.addField(CtField.make("private String name;", ctClass)); byteArray = ctClass.toBytecode();output = new FileOutputStream("F://czp/CtClassTest.class");output.write(byteArray);output.close();} catch (Exception e) {e.printStackTrace();} }?
總結
以上是生活随笔為你收集整理的40、使用javassit操作运行时字节码文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看看整机组编辑都用啥电脑电脑的编辑
- 下一篇: 25、sql分析命令explain和de