赞
踩
JAD 是一款老牌的、经典的、使用起来简单的 Java 反编译工具。大家都知道,将源代码转换成二进制执行代码的过程叫“编译”,比如将 Java 源代码编译成 .class 字节码文件;那么把字节码文件转换成代码的过程就叫“反编译”。
JAD 镜像下载的官网是 https://varaneckas.com/jad/
如果镜像的链接地址失效了,请使用下面这个链接下载:https://download.csdn.net/download/qing_gee/10921233
下载好 JAD 并解压后(镜像),你将看到:
为了更便捷的使用 jad,我们可以将其加入到环境变量中。
新建 JAD_HOME 环境变量。
加入到系统 PATH 变量中。
假如有这样一段代码。
package com.cmower.java_demo.fourteen;
public class Cmower3 {
public static void main(String[] args) {
String cmowers = "";
for (int i = 0; i < 10; i++) {
cmowers += "沉默王二";
}
System.out.println(cmowers);
}
}
保存后的文件名为 Cmower3.java。
打开 CMD,进入该文件所在的路径(如果之前未编译,请先使用 javac 进行编译,生成 class 文件),输入以下命令:
jad Cmower3.class
如果提示信息如下,则证明反编译成功。
Parsing Cmower3.class... Generating Cmower3.jad
与此同时,Cmower3.class 所在的文件夹下会多出来一个新的文件 Cmower3.jad,用文本编辑器打开即可查看。
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: Cmower3.java package com.cmower.java_demo.fourteen; import java.io.PrintStream; public class Cmower3 { public Cmower3() { } public static void main(String args[]) { String s = ""; for(int i = 0; i < 10; i++) s = (new StringBuilder()).append(s).append("\u5A0C\u5910\u7CAF\u941C\u5B29\u7C29").toString(); System.out.println(s); } }
需要注意的是:JAD 不是 JD-GUI,两者都是反编译工具,但并不相同。
比如上面这段代码,JD-GUI 反编译后的结果如下所示:
可以看得出来,JD-GUI 显示的是最原始的 Java 源代码。而 JAD 显示的是更贴近事实的源代码:+ 号操作符在编译的时候其实是会转成 StringBuilder 的。
这特别的关键,如果你想知道编译器的工作内容,就可以使用 JAD。就像 javap 一样,只不过更加的清晰明了,javap 一般人看不太懂,如下:
D:\program\java.git\java_demo\src\main\java\com\cmower\java_demo\fourteen>javap -c Cmower3 警告: 二进制文件Cmower3包含com.cmower.java_demo.fourteen.Cmower3 Compiled from "Cmower3.java" public class com.cmower.java_demo.fourteen.Cmower3 { public com.cmower.java_demo.fourteen.Cmower3(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String 2: astore_1 3: iconst_0 4: istore_2 5: iload_2 6: bipush 10 8: if_icmpge 37 11: new #3 // class java/lang/StringBuilder 14: dup 15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V 18: aload_1 19: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 22: ldc #6 // String 娌夐粯鐜嬩簩 24: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 27: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 30: astore_1 31: iinc 2, 1 34: goto 5 37: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream; 40: aload_1 41: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 44: return }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。