前言

在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。

  1. clone代码

    hg clone http://hg.openjdk.java.net/code-tools/asmtools
  2. 编绎

    cd asmtools/build
    ant
  3. 打包出来的zip包里有一个asmtools.jar

也可以在这里下载我构建的:https://github.com/hengyunabc/hengyunabc.github.io/files/2188258/asmtools-7.0.zip

测试简单的java类

public class Test {
public static void main(String[] args) {
System.out.println("hello");
}
}

先用javac来编绎:

javac Test.java

查看JASM语法结果

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 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语法结果

java -jar asmtools.jar jdec Test.class

结果:

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文件:

java -jar asmtools.jar jasm Test.jasm

同样可以从JCOD生成.class文件:

java -jar asmtools.jar jcoder Test.jasm

更多使用方法参考: https://wiki.openjdk.java.net/display/CodeTools/Chapter+2#Chapter2-Jasm.1

链接

AsmTools的更多相关文章

  1. windows下hla编译环境配置(转)_1

    原文地址:http://blog.chinaunix.net/uid-20548989-id-1667169.html HLA简介         HLA,英文"High Level Ass ...

  2. Deploy 11.2.0.3 RAC+DG on Windows 2008 R2 Step by Step

    环境规划: 节点1: tc1 192.168.56.101 内存:2G 节点2: tc2 192.168.56.102 内存:2G 物理备库:tcdg192.168.56.108内存:1.5G 操作系 ...

  3. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...

  4. JVM总结-虚拟机怎么执行字节码

    1. JRE,JDK JRE : 包含运行 Java 程序的必需组件,Java 虚拟机+ Java 核心类库等. JDK :  JRE + 一系列开发.诊断工具. 2. java字节码 编译器将 Ja ...

  5. 如何唯一确定一个 Java 类?

    今天偶然想起之前和朋友讨论过的一个问题:如何唯一确定一个 Java 类?我相信大多数朋友遇到这个问题的回答都是:类的全路径呗.但事实上,唯一确定一个 Java 类,单单靠类路径是不够的,还要多加上一个 ...

  6. 从字节码层面,解析 Java 布尔型的实现原理

    最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型? 要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件 ...

  7. 〖Android〗Android源代码所有目录生成的Target(编译生成文件反查)

    => build/tools/zipalign: out/host/linux-x86/bin/zipalign (host) => build/tools/atree: out/host ...

  8. windows下hla编译环境配置(转)

    原文地址:http://blog.chinaunix.net/uid-20548989-id-1667169.html HLA简介         HLA,英文"High Level Ass ...

  9. 《深入理解Java虚拟机》-(实战)练习修改class文件

    这是一篇修改class文件的文章.注释并不完全,要抓住这次练习的目的: boolean在虚拟机中是以何种方式解读的 好的,开始我的表演 1.安装asmtools.jar 2.编写一个java文件,并编 ...

随机推荐

  1. scikit-learn学习之贝叶斯分类算法

    版权声明:<—— 用心写好你的每一篇文章,转载请注明出处@http://blog.csdn.net/gamer_gyt <——   目录(?)[+]   ================= ...

  2. pyqt5-UDP消息发送

    使用pyqt5做了一个发送UDP消息的客户端. 项目的完整代码已上传到 github 很简单的,只是用来向某个地址发送UPD消息.这个后面会用到新的功能也会更新.这里贴一下qt5做界面的代码,跟qt4 ...

  3. 判断URL文件是不是在于在。

    判断URL文件是不是在于在. private static bool UrlIsExist(string url) { System.Uri u = null; try { u = new Uri(u ...

  4. 网络构建入门技术(2)——IP子网划分

    说明(2017-5-10 10:54:31): 1. 为什么要子网划分? 子网划分就是,网络位变长,主机位变短的过程.实际上就是将一个大网络,划分成多个小网络的过程. 目的就是为了解决IP地址不够用的 ...

  5. 纯CSS3悬停图标旋转导航动画代码

    分享一款纯CSS3悬停图标旋转导航动画代码.这是一款鼠标移到图标上动画旋转显示导航菜单.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="x_con ...

  6. java基础篇---正则表达式

    正则表达式在许多语言,例如Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能. 正则表达式是一种可以 ...

  7. wcf中的Message类

    客户端->服务端—>客户端 客户端代码: using (new OperationContextScope(client.InnerChannel))            {       ...

  8. Mybatis generator 自动生成代码(2)

    最近准备开始做一个项目,需要开始手动创建sql,于是将Mybatis generator 工具功能强化了下. 首先,这里引入到版本一点的包 <dependency> <groupId ...

  9. mysql5.5编译安装过程(自己总结)

    一,安装过程 //创建mysql安装目录,创建数据存放目录,创建用户和用户组与赋予数据存放目录权限 mkdir -p /usr/local/mysql/ mkdir -p /data/mysql/ g ...

  10. MyEclipse10中配置开发Python所需要的PyDev 绝对靠谱 不忽悠!

    在NLP(自然语言处理)这个领域中,Python具有良好的声誉,于是也想学习一下.首先第一步就是需要在计算机上配置Python环境.由于Python自带的编辑器太简单,使用起来不顺手,于是就考虑在相对 ...