《Java虚拟机学习》 asmtools 字节码汇编器使用 与 JVM识别方法重载 的思考

文章介绍了如何使用asmtools工具修改Java字节码,以实现方法名不同的方法重载。通过示例代码ReWriteDemo,展示了即使返回类型不同,但在JVM允许的情况下,可以成功执行。这种方法在Java编译器中是不被允许的,但通过直接操作字节码,可以达到在JVM级别实现特定效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.asmtools下载

链接:https://pan.baidu.com/s/1R3nAaUbN1Dkf6UKkdEMSEA?pwd=k8l8
提取码:k8l8

2.结合方法重载实验的使用

总所周知,方法重载跟返回值无关,但对于JVM而言,区别方法主要通过 类名,方法名,方法描述符(形参列表+返回值组成),因此返回值不同,其他要素相同JVM也能定位到方法。

但JAVA不行,编译器就会给你报错。因此我们通过 asmtools 修改字节码

2.1 方法名不同先生成类文件

如下面的这个类,除了main方法还有两个方法(方法名不同),首先生成class文件,然后我们在用asmtools 修改方法名,最后在编译成class文件,看最终是否能成功执行;

public class ReWriteDemo {

    public int method1() {
        return 1;
    };

    public String method() {
        return "字符1";
    }

    public static void main(String[] args) {
        ReWriteDemo reWriteDemo = new ReWriteDemo();
        String str = reWriteDemo.method();
        System.out.println("str = " + str);
    }
}

生成class文件

javac ReWriteDemo.java

1

asmtools 转换为 jasm 语法

java -jar asmtools.jar jdis ReWriteDemo.class > ReWriteDemo.jasm

修改方法名

3

反向生成class文件

java -jar asmtools.jar jasm ReWriteDemo.jasm

4

最后用查看生成的class字节码文件 方法名相同,如果在IDEA中这么写首先就会报错,编译更加通不过

image-20230507210917651

运行 (注意操作过程中要删除package) 成功输出内容,验证了对JVM来说,返回值不同,也是方法重载

image-20230507211148205

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋日的晚霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值