前言
在OpenJDK里有一个AsmTools
项目,用来生成正确的或者不正确的java .class
文件,主要用来测试和验证。
我们知道直接修改.class
文件是很麻烦的,虽然有一些图形界面的工具,但还是很麻烦。
以前我的办法是用ASMifier从.class
文件生成asm java代码,再修改代码,生成新的.class
文件,非常麻烦。
AsmTools
引入了两种表示.class
文件的语法:
JASM
用类似java本身的语法来定义类和函数,字节码指令则很像传统的汇编。
JCOD
整个
.class
用容器的方式来表示,可以很清楚表示类文件的结构。
重要的是两种语法的文件都是可以和.class
互相转换的。
构建AsmTools
官方文档: https://wiki.openjdk.java.net/display/CodeTools/How+to+build+AsmTools
需要有jdk8和ant。
clone代码
1
hg clone http://hg.openjdk.java.net/code-tools/asmtools
编绎
1
2cd asmtools/build
ant打包出来的zip包里有一个
asmtools.jar
。
也可以在这里下载我构建的:https://github.com/hengyunabc/hengyunabc.github.io/files/2188258/asmtools-7.0.zip
测试简单的java类
1 | public class Test { |
先用javac来编绎:
1 | javac Test.java |
查看JASM语法结果
1 | java -jar asmtools.jar jdis Test.class |
结果:
1 | super public class Test |
查看JCOD语法结果
1 | java -jar asmtools.jar jdec Test.class |
结果:
1 | class Test { |
从JASM/JCOD语法文件生成类文件
因为是等价表达,可以从JASM生成.class
文件:
1 | java -jar asmtools.jar jasm Test.jasm |
同样可以从JCOD生成.class
文件:
1 | java -jar asmtools.jar jcoder Test.jasm |
更多使用方法参考: https://wiki.openjdk.java.net/display/CodeTools/Chapter+2#Chapter2-Jasm.1