asmtools的简单使用

在学习GeekTime《深入拆解Java虚拟机》的时候,课后作业有一个使用asmtools的需求,于是我上网简单查找了一下使用方法并记录了一下。
首先asmtools下载地址如下:
asmtools的下载地址

课后作业的例子代码如下.

public class Foo {
 public static void main(String[] args) {
  boolean flag = true;
  if (flag) System.out.println("Hello, Java!");
  if (flag == true) System.out.println("Hello, JVM!");
 }
}

然后我门先用javac编译为想要查看的文件为.class文件

javac Foo.java

而asmtools主要这个有两个用法:
(1)由class文件转化位jasm文件

java -jar /home/geektime/underJVM/asmtools-7.0/lib/asmtools.jar jdis Foo.class > Foo.jasm

我们首先利用反编译工具(可以用jad)这边我使用的是cfr查看class文件.
cfr下载地址

java -jar cfr-0.151.jar Foo.class

得到反编译后的代码为

/*
 * Decompiled with CFR 0.151.
 */
public class Foo {
    public static void main(String[] stringArray) {
        boolean bl = true;
        if (bl) {
            System.out.println("Hello, Java!");
        }
        if (bl) {
            System.out.println("Hello, JVM!");
        }
    }
}

也可以不重定向到文件中,结果就会直接输出到终端

java -jar /home/geektime/underJVM/asmtools-7.0/lib/asmtools.jar jdis Foo.class 

然后我们查看Foo.jasm文件

super public class Foo
	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_1;
		istore_1;
		iload_1;
		ifeq	L14;
		getstatic	Field java/lang/System.out:"Ljava/io/PrintStream;";
		ldc	String "Hello, Java!";
		invokevirtual	Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
	L14:	stack_frame_type append;
		locals_map int;
		iload_1;
		iconst_1;
		if_icmpne	L27;
		getstatic	Field java/lang/System.out:"Ljava/io/PrintStream;";
		ldc	String "Hello, JVM!";
		invokevirtual	Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
	L27:	stack_frame_type same;
		return;
}

} // end Class Foo

这里我们使用vim将Method Main中的第一个iconst_1改为iconst_2。走向第二步

(2)由jasm文件转化为.class文件

java -jar /home/geektime/underJVM/asmtools-7.0/lib/asmtools.jar jasm Foo.jasm

这样就生成了一个修改后的class文件,我们来验证一下。
首先反编译一下查看一下修改后的class文件

/*
 * Decompiled with CFR 0.151.
 */
public class Foo {
    public static void main(String[] stringArray) {
        int n = 2;
        if (n != 0) {
            System.out.println("Hello, Java!");
        }
        if (n == 1) {
            System.out.println("Hello, JVM!");
        }
    }
}

然后我们在运行一下.class

java Foo

发现只输出**Hello,Java!**这样我们就成功了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值