ByteBuddy(一)—認識ByteBuddy

簡介

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》

----END----

喜歡就點個??吧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容