栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java汇编工具 AsmTools的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java汇编工具 AsmTools的使用

1.构建AsmTools

AsmTools 是一组用于创建和解构 Java 类文件的程序,简单来说就是可以把java生成的class文件,生成汇编代码,然后再生成class。

1.1.配置Apache Ant

使用apache ant 编译asmtools,首先安装ant。

下载地址:https://ant.apache.org/bindownload.cgi

下载后解压目录如下:

配置环境变量

新建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-builddist目录是编译成功后生成的目录,asmtools.jar 文件在releaselib目录下。

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 "":"()V"
        stack 1 locals 1
  {
                aload_0;
                invokespecial   Method java/lang/Object."":"()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.class

java -jar asmtools.jar jasm Test.jasm

再次执行java Test命令运行Test.class。输出如下:

you are vip

参考文档:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708705.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号