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
asmtools 转换为 jasm 语法
java -jar asmtools.jar jdis ReWriteDemo.class > ReWriteDemo.jasm
修改方法名
反向生成class文件
java -jar asmtools.jar jasm ReWriteDemo.jasm
最后用查看生成的class字节码文件 方法名相同,如果在IDEA中这么写首先就会报错,编译更加通不过
运行 (注意操作过程中要删除package) 成功输出内容,验证了对JVM来说,返回值不同,也是方法重载