簡介
ByteBuddy是一個基于Java的開源庫,用于生成和操作Java字節(jié)碼。
ByteBuddy是在Apache許可證2.0版下獲得許可的,可在Github上免費使用。
Byte Buddy能以通過修改字節(jié)碼來新增、修改和刪除Java類的現(xiàn)有功能。
程序可以在maven構件時或應用程序運行時進行使用ByteBuddy。
由于應用程序需要滿足不同類型的要求,例如功能性要求和非功能性要求,現(xiàn)代應用程序在性質上很復雜。有些應用程序包含多個模塊,每個模塊都有自己的功能代碼。由于非功能性需求,功能代碼被非功能性代碼包圍,例如,安全處理、日志記錄、性能監(jiān)控、資源使用獲取跟蹤,按使用計費、DevOps相關處理等。

功能代碼,沒有非功能代碼
public double calculatePrice(){
double discount = getDiscount();
double price = this.price + this.deliveryCharge - discount;
return price;
}
我需要添加一些非功能代碼,打印一些日志,并計算耗時
第2、3、6、7行是非功能代碼
1. public double calculatePrice(){
2. long startTime = System.currentMilliseconds();
3. logger.info("CalculatePrice start");
4. double discount = getDiscount();
5. double price = this.price + this.deliveryCharge - discount
6. logger.info("Method end");
7. logger.info("CalculatePrice execution time: " + (System.currentMillioseconds() - startTime));
8. return price;
9. }
當應用程序中的非業(yè)務性代碼和業(yè)務交叉復用方法時,復雜性會增加,這會導致非業(yè)務代碼和業(yè)務代碼之間的輕微耦合,導致代碼維護困難。
分離功能代碼和非功能代碼
為了消除復雜性,應用開發(fā)團隊可以在maven構建時或應用程序運行時將代碼注入到函數(shù)代碼中,并生成包含函數(shù)代碼和非函數(shù)代碼的指令代碼。開發(fā)團隊可以使用ByteBuddy以編程方式配置指令。

ByteBuddy將更改Java字節(jié)碼(Java類文件),而不是Java源代碼。
使用ByteBuddy的好處:
- ByteBuddy通過字節(jié)碼檢測自動編碼。
- ByteBuddy增加了可重用性,因為所有非功能編解碼器都可以用Java代碼在一個
Advice文件中創(chuàng)建,并且可以隨時在不同的Java類中使用。 - 修改字節(jié)碼,無需重新編譯反應用程序
- 修改代碼而無需重新啟動應用程序服務器。
ByteBuddy使用策略攔截Java字節(jié)碼:
OnMethod Enter
OnMethod Exit
構建時間也適用于應用程序運行時的指令。
ByteBuddy支持檢測和修改現(xiàn)有Java字節(jié)碼的工具。
- 添加新的構造函數(shù)、方法和實例變量
- 刪除現(xiàn)有構造函數(shù)、方法和實例變量
- 修改實例變量的值。
- 修改方法參數(shù)的值。
- 檢查現(xiàn)有的Java類結構、構造函數(shù)簽名、方法簽名和實例變量。
- 生成新的泛型Java類、構造函數(shù)、方法和實例變量(上界、下界、多界、通配符、參數(shù)化類型、方法類型參數(shù))
- 搜索并替換方法中的代碼。
- 添加和刪除對Java類、構造函數(shù)、方法、實例變量和參數(shù)進行注釋的注釋
- 添加和修改Java內部類(添加第一級和第二級
linner類,攔截內部類和匿名類)。 - 生成新的Java類、Java接口、枚舉、注釋和抽象類。
- 生成簡單方法和
lambda表達式。 - 在Advice代碼之間共享數(shù)據(jù)。
反編譯器
Java反編譯器需要檢查Java類格式的插入代碼。
Java反編譯器可以將類文件轉換為Java源代碼。
這對于驗證生成的字節(jié)碼非常重要。
開發(fā)環(huán)境
JDK:OpenJDK-11+28
ByteBuddy:version1.10.16
Maven環(huán)境
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.16</version>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.10.16</version>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-maven-plugin</artifactId>
<version>1.10.16</version>
</dependency>
bytebuddy書籍《Java Interceptor Development with ByteBuddy: Fundamental》
喜歡就點個??吧