前言
转自:http://hengyunabc.github.io/openjdk-asmtools/
在OpenJDK里有一个AsmTools
项目,用来生成正确的或者不正确的java .class
文件,主要用来测试和验证。
我们知道直接修改.class
文件是很麻烦的,虽然有一些图形界面的工具,但还是很麻烦。
以前我的办法是用ASMifier 从.class
文件生成asm java代码,再修改代码,生成新的.class
文件,非常麻烦。
AsmTools
引入了两种表示.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
编绎
打包出来的zip包里有一个asmtools.jar
。
也可以在这里下载我构建的:https://github.com/hengyunabc/hengyunabc.github.io/files/2188258/asmtools-7.0.zip
测试简单的java类
12345
public class Test { public static void main(String[] args) { System.out.println("hello"); }}
先用javac来编绎:
查看JASM语法结果
1
java -jar asmtools.jar jdis Test.class
结果:
12345678910111213141516171819202122232425
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 1{ getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; ldc String "hello"; invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V"; return;}} // end Class Test
查看JCOD语法结果
1
java -jar asmtools.jar jdec Test.class
结果:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
class Test { 0xCAFEBABE; 0; // minor version 52; // version [] { // Constant Pool ; // first element is empty class #2; // #1 Utf8 "Test"; // #2 class #4; // #3 Utf8 "java/lang/Object"; // #4 Utf8 "<init>"; // #5 Utf8 "()V"; // #6 Utf8 "Code"; // #7 Method #3 #9; // #8 NameAndType #5 #6; // #9 Utf8 "LineNumberTable"; // #10 Utf8 "LocalVariableTable"; // #11 Utf8 "this"; // #12 Utf8 "LTest;"; // #13 Utf8 "main"; // #14 Utf8 "([Ljava/lang/String;)V"; // #15 Field #17 #19; // #16 class #18; // #17 Utf8 "java/lang/System"; // #18 NameAndType #20 #21; // #19 Utf8 "out"; // #20 Utf8 "Ljava/io/PrintStream;"; // #21 String #23; // #22 Utf8 "hello"; // #23 Method #25 #27; // #24 class #26; // #25 Utf8 "java/io/PrintStream"; // #26 NameAndType #28 #29; // #27 Utf8 "println"; // #28 Utf8 "(Ljava/lang/String;)V"; // #29 Utf8 "args"; // #30 Utf8 "[Ljava/lang/String;"; // #31 Utf8 "SourceFile"; // #32 Utf8 "Test.java"; // #33 } // Constant Pool 0x0021; // access #1;// this_cpx #3;// super_cpx [] { // Interfaces } // Interfaces [] { // fields } // fields [] { // methods { // Member 0x0001; // access #5; // name_cpx #6; // sig_cpx [] { // Attributes Attr(#7) { // Code 1; // max_stack 1; // max_locals Bytes[]{ 0x2AB70008B1; } [] { // Traps } // end Traps [] { // Attributes Attr(#10) { // LineNumberTable [] { // LineNumberTable 0 2; } } // end LineNumberTable ; Attr(#11) { // LocalVariableTable [] { // LocalVariableTable 0 5 12 13 0; } } // end LocalVariableTable } // Attributes } // end Code } // Attributes } // Member ; { // Member 0x0009; // access #14; // name_cpx #15; // sig_cpx [] { // Attributes Attr(#7) { // Code 2; // max_stack 1; // max_locals Bytes[]{ 0xB200101216B60018; 0xB1; } [] { // Traps } // end Traps [] { // Attributes Attr(#10) { // LineNumberTable [] { // LineNumberTable 0 5; 8 6; } } // end LineNumberTable ; Attr(#11) { // LocalVariableTable [] { // LocalVariableTable 0 9 30 31 0; } } // end LocalVariableTable } // Attributes } // end Code } // Attributes } // Member } // methods [] { // Attributes Attr(#32) { // SourceFile #33; } // end SourceFile } // Attributes} // end 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
链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
2013-11-12 JAVA类的加载(3) ——类加载后能够有效运行
2013-11-12 JAVA类的加载(1) ——类的加载及类加载器介绍