日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Javassist如何操作Java 字節碼

瀏覽:21日期:2022-08-25 15:44:26

一、開篇

說起 AOP 小伙伴們肯定很熟悉,無論是 JDK 動態代理或者是 CGLIB 等,其底層都是通過操作 Java 字節碼來實現代理。常用的一些操作字節碼的技術有 ASM、AspectJ、Javassist 等。

ASM 其設計和實現是盡可能小而且快,更專注于性能。它在指令的層面來操作,所以使用它需要對 JVM 的指令有所了解,門檻較高,CGLIB 就使用了 ASM 技術。AspectJ 擴展了 Java 語言,定義了一系列 AOP 語法,在 JVM 中運行需要使用特定的編譯器生成遵守 Java 字節碼規范的 Class 文件,Spring AOP 使用了 AspectJ 。Javassist 直接使用 Java 編碼的形式操作字節碼,簡單易上手,性能高于反射,相比于 ASM 稍低。

二、Javassist 常用類

Javassist 抽象出一個 ClassPool 對象來操作 Java 類,可以通過 ClassPool.getDefault() 來獲取默認的 ClassPool 。常用的對象:

CtClass:代表一個 Class 的實例,可以通過類的全限定名來獲取 CtClass 對象,其中包含了對 Class 的各種操作。ClassPool:通過 HashTable 保存了路徑下的 CtClass 信息,key為類的全限定名稱,value 為類名對應的 CtClass 對象。CtMethod、CtField:抽象出類的方法和屬性,可以用于定義或修改方法和字段。

三、Javassist 的使用

1、依賴

<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.27.0-GA</version></dependency>

2、代碼示例

// 獲取默認類池 ClassPool classPool = ClassPool.getDefault(); // 1. 創建空類 CtClass ctClass = classPool.makeClass('com.aysaml.demo.javassist.User'); // 2. 創建 String 類型的 name 字段 CtField field = new CtField(classPool.get('java.lang.String'), 'name', ctClass); // 設置字段訪問級別 private field.setModifiers(Modifier.PRIVATE); // 增加字段 ctClass.addField(field); // 3. 增加 getter & setter 方法 ctClass.addMethod(CtNewMethod.getter('getName', field)); ctClass.addMethod(CtNewMethod.setter('setName', field)); // 4. 增加無參構造方法:其中 $0 表示 this,$1 表示參數 CtConstructor noArgsCons = new CtConstructor(new CtClass[] {}, ctClass); noArgsCons.setBody('{$0.name='mark';}'); ctClass.addConstructor(noArgsCons); // 5. 增加有參構造方法 CtConstructor hasArgsCons = new CtConstructor(new CtClass[] {classPool.get('java.lang.String')}, ctClass); hasArgsCons.setBody('{$0.name=$1;}'); ctClass.addConstructor(hasArgsCons); // 6. 創建方法 CtMethod method = new CtMethod(CtClass.voidType, 'printName', new CtClass[] {}, ctClass); method.setBody('{System.out.println($0.name);}'); ctClass.addMethod(method); // 7. 生成類文件:可指定路徑,默認為當前項目根目錄 ctClass.writeFile(); // 8. 創建類實例 Object person = ctClass.toClass().newInstance();

3、如何實現類似 AOP 的功能

由上可見,Javassist 對于編程化的操作字節碼是很簡單易懂的,我們以在方法的開頭結尾打印信息為例:

public class Cat { /** 記錄喵喵喵的次數 */ private int num; public void miao() { this.num++; }}

我們要在 miao( ) 方法的前增加聲音輸出:

public static void main(String[] args) throws NotFoundException, CannotCompileException { ClassPool classPool = ClassPool.getDefault(); // 獲取 Cat 類的 CtClass 對象 CtClass catClass = classPool.get('com.aysaml.demo.javassist.Cat'); // 獲取 miao( ) 方法 CtMethod method = catClass.getDeclaredMethod('miao'); method.insertBefore('System.out.println('miao~');'); // 加載修改過的類,注意必須要保證調用前這個類沒有被加載過 catClass.toClass(); //測試 Cat cat = new Cat(); cat.miao(); }

注意到,在使用 catClass.toClass() 加載被修改過的類時,強調必須保證在調用前這個類沒有被加載過,否則會報 attempted duplicate class definition for name 異常。

我們知道一個類是不能被一個類加載器加載兩次的,所以為了解決這個問題,需要制定一個沒有加載過該類的 Classloader,Javassist 提供了一個 ClassLoader ,如下:

public class Cat { /** 記錄喵喵喵的次數 */ private int num; public void miao() { System.out.println('調用了 miao 方法'); this.num++; } public static void main(String[] args) throws Exception{ ClassPool classPool = ClassPool.getDefault(); // 獲取 Cat 類的 CtClass 對象 CtClass catClass = classPool.get('com.aysaml.demo.javassist.Cat'); // 獲取 miao( ) 方法 CtMethod method = catClass.getDeclaredMethod('miao'); method.insertBefore('System.out.println('miao~');'); // 重新設置一個 Classloader Loader classLoader = new Loader(classPool); Class clazz = classLoader.loadClass('com.aysaml.demo.javassist.Cat'); // 調用修改過的類的方法 clazz.getDeclaredMethod('miao').invoke(clazz.newInstance()); }}

執行結果為:

Javassist如何操作Java 字節碼

四、結語

關于 Javassist 暫時就說這么多了,更多使用方法參考官方 github wiki :

以上就是Javassist如何操作Java 字節碼的詳細內容,更多關于Javassist 操作Java 字節碼的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
av一区二区高清| 性欧美videohd高精| 日韩午夜电影| 日本高清不卡一区二区三区视频| 日本欧美国产| 国产一区二区三区四区五区 | 欧美国产另类| 国产精品激情| 日韩av免费大片| 高清av不卡| 人人精品亚洲| 亚洲国产不卡| 蜜臀av亚洲一区中文字幕| 久久99伊人| 99久久婷婷| 亚洲精品一区二区妖精| 国产色综合网| 亚洲aa在线| 国产精品毛片aⅴ一区二区三区| 日韩欧美中文字幕在线视频| 97久久亚洲| 久久伊人国产| 99久久99久久精品国产片果冰| 午夜国产精品视频| 日韩精品三区四区| 韩国女主播一区二区三区| 成人午夜国产| 国产精品免费看| 欧美亚洲tv| 国产在线看片免费视频在线观看| 日韩视频网站在线观看| 日韩一级精品| 国产日产精品_国产精品毛片 | 国产成人在线中文字幕| 视频二区不卡| 美国三级日本三级久久99| 欧美一区二区三区久久精品| 国产精品tv| 美女少妇全过程你懂的久久| 亚洲影院天堂中文av色| 国产精品亚洲四区在线观看| 理论片午夜视频在线观看| 宅男在线一区| 日韩美女国产精品| 青青草91视频| 日韩影院二区| 亚久久调教视频| 在线亚洲人成| 亚洲精品成人一区| 91亚洲国产| 香蕉成人久久| 国产极品模特精品一二| 欧美福利一区| 麻豆久久一区二区| 亚洲一区激情| 精品一区二区三区四区五区| 亚洲激情婷婷| 美女视频黄 久久| 99精品99| 国产精品任我爽爆在线播放 | 国产一区观看| 欧美一区激情| 欧美+日本+国产+在线a∨观看| 日韩精品久久久久久| 亚洲综合在线电影| 91成人在线网站| 91精品二区| 国产精品成人3p一区二区三区| 欧美二区视频| 精品国产aⅴ| 日韩综合小视频| 国产真实久久| 日韩三级精品| 午夜日韩福利| 国产成人免费视频网站视频社区| 亚洲专区视频| 米奇777超碰欧美日韩亚洲| 狂野欧美性猛交xxxx| 日韩影片在线观看| 亚洲女同一区| 久久久男人天堂| 欧美日本二区| 喷白浆一区二区| 国产在线日韩| 亚洲性色av| 日韩av有码| 国产精品jk白丝蜜臀av小说| 欧美日一区二区| 欧美激情另类| 久久国产日韩欧美精品| 丝袜脚交一区二区| 亚洲国产日韩欧美在线| 欧美精品资源| 中文一区一区三区高中清不卡免费| 免费精品视频| 亚洲高清激情| 99免费精品| 日韩在线不卡| 日韩大片在线播放| 欧美国产偷国产精品三区| 国产日产精品_国产精品毛片| 蜜桃免费网站一区二区三区| 久久精品在线| 成人免费电影网址| 欧洲一级精品| 涩涩av在线| а√天堂8资源中文在线| 久久只有精品| 精品久久美女| 精品亚洲免a| 精品国产黄a∨片高清在线| 免费在线亚洲欧美| 久久精品资源| 麻豆成人在线观看| 开心激情综合| 国产精品超碰| 欧美黄色一区二区| 日本不卡视频在线观看| 日韩精品一二三四| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜国产精品视频| 香蕉国产精品| 国产视频欧美| 中文字幕一区二区精品区| 蜜臀精品一区二区三区在线观看 | 蜜桃久久精品一区二区| 好看不卡的中文字幕| 狠狠色狠狠色综合日日tαg| 欧洲在线一区| 国内激情久久| 中国女人久久久| 麻豆精品网站| 亚洲精品伊人| 国产日韩亚洲| 精品国产三区在线| 在线一区av| 欧美综合另类| 中文日韩在线| 日韩高清一级| 国产激情综合| 97精品国产福利一区二区三区| 中文字幕在线视频网站| 999久久久精品国产| 久久精品高清| 国产精品美女久久久浪潮软件| 亚洲精一区二区三区| 欧美日本一区| 精品高清久久| 欧美成人国产| 视频精品一区| 国产一区二区视频在线看| 中文另类视频| 视频一区视频二区中文字幕| 日韩av网站在线免费观看| 国产精品成人3p一区二区三区| 高清日韩欧美| 99国产精品99久久久久久粉嫩| 亚洲九九精品| 日本少妇一区二区| 国产一区2区| 好吊日精品视频| 日韩精品1区2区3区| 国产91在线播放精品| 欧美久久精品一级c片| 亚洲区第一页| 日韩88av| 蜜桃久久av| 美女毛片一区二区三区四区最新中文字幕亚洲 | 欧美日韩夜夜| 捆绑调教日本一区二区三区| 91久久中文| 国产精品丝袜在线播放| 99精品国产一区二区三区| 少妇精品久久久一区二区三区| 麻豆一区在线| 婷婷色综合网| 国产图片一区| 亚洲手机视频| 国产欧美日韩精品高清二区综合区| 久草免费在线视频| 另类av一区二区| 精品国产中文字幕第一页| 午夜精品成人av| 日本va欧美va精品发布| 婷婷激情一区| 日韩av网站在线免费观看| 日韩中文首页| 日本电影久久久| 亚洲a在线视频| 欧美日韩一区二区高清| 激情婷婷欧美| 麻豆中文一区二区| 日韩精品一级中文字幕精品视频免费观看| 牛牛精品成人免费视频| 香蕉久久久久久久av网站| 国产成人精选| 青青伊人久久| 91精品一区二区三区综合在线爱 | 亚洲高清成人| 欧美激情亚洲|