本文将从反编译的工具,反编译举例等角度来讲解。
虽然本节概念不难,但是仍然希望大家研究问题之前,一定先搞清楚概念。
Java 编译是指将 Java 源码编译成 Java 字节码的过程。
Java 反编译是指根据 Java 字节码 “翻译” 成源码的过程。
为了深刻理解这个问题,大家可以思考他们的区别和目的是什么。
从编码来看,源码是字符编码,字节码是二进制字节流。
从目的来讲,源码是给人看的,字节码是给虚拟机看的。
因此如果想给人看,需要将字节码转为源码。如果想给虚拟机执行,需要将源码编译成字节码。
因此当我们有类文件想看源码时,可以采用反编译的方式实现。
比如想了解某个 Java 语法糖编译后,再反编译是什么样的;别人给你发一个 jar 包,你需要看其中某个类是怎么写的,等此类情况都可以考虑是用 Java 反编译。
不知道大家有没有思考过这个问题:为什么不直接编译成目标系统的可执行文件呢?
还记得 Java 设计的初衷吗?
对,就是跨平台。
如何实现跨平台的呢?
Java 源码编译成字节码,然后通过不同平台的虚拟机解释执行,从而实现 “一次编译,到处运行” 的跨平台的效果。
这体现出怎样的思想呢?
剑桥大学计算机科学家和计算机科学教授 David John Wheeler 有一句名言:
“Any problem in computer science can be solved by anther layer of indirection.”(计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决)
很多技术都是借鉴了这种思想:
如上图所示:
还有很多采用这种经典思想的案例,大家可以自行思考。
离线反编译工具的主要优势是安全性高,使用的体验更好。
同样推荐三款主流的离线反编译工具:IDEA 自带、 JD-GUI 、Luyten、CFR、 JAD 等。
一、IDEA 自带的反编译工具,大家在 IDEA 中点击类文件即可使用。
二、JD-GUI
JD-GUI 是一个知名的反编译工具。 使用非常方便,下载后将类文件或者 jar 包直接拖动到界面即可。
下面看一个简单和常见的案例:
public class ForEachDemo {
public static void main(String[] args) {
List data = new ArrayList<>();
data.add("a");
data.add("b");
for (String str : data) {
System.out.println(str);
}
}}
我们直接在 IDEA 对该类文件进行编译,然后再 target 目录中寻找该类,双击打开,得到下面的反编译源码:
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。