天天看點

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

JBE

JBE(Java Bytecode Editor)是一個Java位元組碼編輯工具,而且是開源的,該項目是基于jclasslib ej-technologies(https://github.com/ingokegel/jclasslib)位元組碼檢視工具和Apache Jakarta項目。

下載下傳完成後解壓即可使用

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

點選jbe. bat(Windows)或jbe.sh(Linux)即可運作JBE。src目錄下的是JBE的源碼。

使用示例

測試環境說明

Java環境:jdk1.8

使用工具:IDEA、JBE

1.建立一個Test源碼如下:

public class Test {

public void a(){

System.out.println("run Test a function");

}

public static void main(String[] args) {

new Test().a();

}

}

2.按Ctrl+Shift+F9編譯Test.java,IDEA會把.class檔案生成在out目錄下

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

3.用JBE打開(File——Open class file)Test.class

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

在左邊可以看到該類的常量池(Constant Pool)、字段(Fields)、方法(Method)等資訊。點選XXX方法,選擇[0] Code檢視該方法的位元組碼。在右邊可以看到方法的位元組碼,點選Code Editor可編輯位元組碼.

4.修改方法位元組碼(位元組碼看不懂?不會寫怎麼辦?這裡分享個方法,我們可以通過IDEA、Eclipse編寫java源碼,編譯成.class,通過JBE打開就可以得到想要的位元組碼了,再把位元組碼拷貝、粘貼到要修改的地方就好了)。

比如:我這裡要把new Test().a();位元組碼改成Test2.a()。

Test2.java源碼:

public class Test2 {

public static void a(){

System.out.println("run Test2 a function");

}

}

(1)首先我建立一個Demo類,并編寫了我想要的源碼并編譯。

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

(2)這裡用的是IDEA,.class就在out目錄下。通過JBE打開out目錄下的Demo.class

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

紅框中的就是我想要的位元組碼

(3)然後把得到的位元組碼拷貝替換掉new Test().a();的位元組碼。最後點Save method儲存修改的位元組碼。

new Test().a();的位元組碼:

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

修改後:

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

5.最後,測試是否修改成功,打開指令行工具,執行java Test,輸出如果是”run Test2 a function”,而不是”run Test a function”就成功了。

java 修改位元組碼_使用JBE(Java Bytecode Editor)修改Java位元組碼

如果是修改jar檔案中的.class檔案。因為jar其實也是個zip檔案,是以把修改後的.class替換掉原來jar中的.class,然後重新壓縮并修改字尾為jar就好了。