我是靠谱客的博主 贤惠哑铃,最近开发中收集的这篇文章主要介绍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!**这样我们就成功了。

最后

以上就是贤惠哑铃为你收集整理的asmtools的简单使用的全部内容,希望文章能够帮你解决asmtools的简单使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部