使用JBE(Java Bytecode Editor)修改Java字节码

Posted 郡麟天下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JBE(Java Bytecode Editor)修改Java字节码相关的知识,希望对你有一定的参考价值。




JBE

JBE(Java Bytecode Editor)是一个Java字节码编辑工具,而且是开源的,该项目是基于jclasslib ej-technologies(
https://github.com/ingokegel/jclasslib)字节码查看工具和Apache Jakarta项目。JBE下载地址:
http://set.ee/jbe/


下载完成后解压即可使用 




点击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目录下 



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



在左边可以看到该类的常量池(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类,并编写了我想要的源码并编译。 



(2)这里用的是IDEA,.class就在out目录下。通过JBE打开out目录下的Demo.class 




红框中的就是我想要的字节码

(3)然后把得到的字节码拷贝替换掉new Test().a();的字节码。最后点Save method保存修改的字节码。 

new Test().a();的字节码: 




修改后: 



5.最后,测试是否修改成功,打开命令行工具,执行java Test,输出如果是”run Test2 a function”,而不是”run Test a function”就成功了。 



如果是修改jar文件中的.class文件。因为jar其实也是个zip文件,所以把修改后的.class替换掉原来jar中的.class,然后重新压缩并修改后缀为jar就好了。


以上是关于使用JBE(Java Bytecode Editor)修改Java字节码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 和元模型时出现异常 java.lang.ClassCastException: javassist.bytecode.InterfaceMethodrefInfo cannot

java反编译工具Bytecode-Viewer

java.lang.ClassNotFoundException:org.hibernate.bytecode.instrumentation.internal.FieldInterceptionHe

编译为Java Bytecode并可在JVM上运行的语言

是否有像 ASM for Java Bytecode 这样的 CIL 静态分析库? [关闭]

JAVA编程中source code和bytecode有啥区别,不要太详细的