1.构建AsmTools
AsmTools 是一组用于创建和解构 Java 类文件的程序,简单来说就是可以把java生成的class文件,生成汇编代码,然后再生成class。
1.1.配置Apache Ant
使用apache ant
编译asmtools,首先安装ant。
-
下载后解压目录如下:
-
配置环境变量
新建ANT_HOME变量:ANT_HOME:
您的apache-ant目录\apache-ant-1.9.16
在PATH中添加:
%ANT_HOME%\bin
-
测试ANT环境
ant -version
1.2.构建AsmTools
在github下载asmTools源码,https://github.com/openjdk/asmtools 。
如果github下载比较慢,也可以在官网下载:http://hg.openjdk.java.net/code-tools/asmtools/。
下载后解压源码,进入到build
,然后执行 ant
命令,编译成功界面如下:
asmtools-7.0-build\dist
目录是编译成功后生成的目录,asmtools.jar
文件在release\lib
目录下。
2. Asmtools使用案例
以下面这段代码为例,使用Asmtools把class文件生成汇编语言,通过修改汇编文件,使其输出you are vip
public class Test {
public static void main(String[] args) {
boolean flag = false;
if (flag) {
System.out.println("you are vip");
}else {
System.out.println("you are not vip");
}
}
}
-
生成class 文件,
javac Test.java
-
执行
java Test
命令运行Test.class。输出如下:you are not vip
-
使用asmtools的
jdis
命令,把class生成为汇编语言:java -jar asmtools.jar jdis Test.class
执行结果为:
super public class Test version 52:0 { public Method "<init>":"()V" stack 1 locals 1 { aload_0; invokespecial Method java/lang/Object."<init>":"()V"; return; } public static Method main:"([Ljava/lang/String;)V" stack 2 locals 2 { iconst_0; istore_1; iload_1; ifeq L17; getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; ldc String "you are vip"; invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V"; goto L25; L17: stack_frame_type append; locals_map int; getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; ldc String "you are not vip"; invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V"; L25: stack_frame_type same; return; } } // end Class Test
JVM把我们上面定义的bool类型变量
flag
,编译成了int类型(0表示fasle,1表示true)的iconst_0
。iconst_0 将1压入操作数栈
istore_1 将操作数栈顶保存至局部变量表1位置,
iload_1 再讲局部变量表1 位置加载到操作数栈顶
ifeq L17 判断栈顶位置是否为0 为零则跳转到L17 -
把上面生成的汇编语言,保存到文件并命名为
Test.jasm
修改
iconst_0
为iconst_1
-
使用
Jasm
命令把Test.jasm
重新编译为Test.classjava -jar asmtools.jar jasm Test.jasm
-
再次执行
java Test
命令运行Test.class。输出如下:you are vip
参考文档: