Java汇编工具 AsmTools的使用

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_0iconst_1

  • 使用Jasm 命令把Test.jasm 重新编译为Test.class

    java -jar asmtools.jar jasm Test.jasm
    
  • 再次执行java Test命令运行Test.class。输出如下:

    you are vip
    

参考文档:

https://wiki.openjdk.java.net/display/CodeTools/asmtools

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值