40、使用javassit操作运行时字节码文件
生活随笔
收集整理的這篇文章主要介紹了
40、使用javassit操作运行时字节码文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、是什么
Javassit是一個功能包,作用類似于java的反射,用于操作運(yùn)行時字節(jié)碼文件,實(shí)現(xiàn)動態(tài)編程,但性能高于反射。
2、怎么用?
首先需要獲取存放class文件的容器ClassPool,根據(jù)全類名獲取一個CtClass對象,根據(jù)需要修改這個CtClass對象,如果.class文件已經(jīng)被JVM加載了,則需要先調(diào)用ctClass.stopPruning(true),最后使用字節(jié)流將CtClass對象生成的字節(jié)數(shù)組寫到對應(yīng)的.class文件
3、代碼實(shí)例
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)); //獲取字節(jié)數(shù)組寫入到指定文件byte[] byteArray = ctClass.toBytecode();FileOutputStream output = new FileOutputStream("F://czp/CtClassTest.class ");output.write(byteArray); output.close();if(ctClass.isFrozen()){//如果class文件被凍結(jié),已經(jīng)被jvm加載ctClass.defrost();//解凍}//在class Pool中獲取到對應(yīng).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();} }?
總結(jié)
以上是生活随笔為你收集整理的40、使用javassit操作运行时字节码文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看看整机组编辑都用啥电脑电脑的编辑
- 下一篇: 25、sql分析命令explain和de