概述
在学习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的简单使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复