京东自营 618 + 国补 iPhone 历史最低价          领 618 红包,最高25618元

Java 反编译说明与工具

本文将从反编译的工具,反编译举例等角度来讲解。

1. 反编译是什么

虽然本节概念不难,但是仍然希望大家研究问题之前,一定先搞清楚概念。


Java 编译是指将 Java 源码编译成 Java 字节码的过程。

Java 反编译是指根据 Java 字节码 “翻译” 成源码的过程。

2. 为什么要反编译

2.1 为什么要有反编译和反汇编呢?

为了深刻理解这个问题,大家可以思考他们的区别和目的是什么。

从编码来看,源码是字符编码,字节码是二进制字节流。

从目的来讲,源码是给人看的,字节码是给虚拟机看的。

因此如果想给人看,需要将字节码转为源码。如果想给虚拟机执行,需要将源码编译成字节码。

因此当我们有类文件想看源码时,可以采用反编译的方式实现。

比如想了解某个 Java 语法糖编译后,再反编译是什么样的;别人给你发一个 jar 包,你需要看其中某个类是怎么写的,等此类情况都可以考虑是用 Java 反编译。

2.2 为什么不直接编译成可执行文件?

不知道大家有没有思考过这个问题:为什么不直接编译成目标系统的可执行文件呢?

还记得 Java 设计的初衷吗?

对,就是跨平台。

如何实现跨平台的呢?

Java 源码编译成字节码,然后通过不同平台的虚拟机解释执行,从而实现 “一次编译,到处运行” 的跨平台的效果。

这体现出怎样的思想呢?

剑桥大学计算机科学家和计算机科学教授 David John Wheeler 有一句名言:

“Any problem in computer science can be solved by anther layer of indirection.”(计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决)

很多技术都是借鉴了这种思想:



如上图所示:

  • 为了加快指令的复制和执行效率,在处理器和主存之间加入高速缓存存储器。
  • 为了加快数据的访问速度,在数据库和应用程序之间加入缓存层(如 redis)。
  • 为了实现 Redis 的高可用,加入了哨兵对 redis 服务器进行监控。
  • 为了实现负载均衡,提高服务能力,在访问者和 Web 服务器之间,加入反向代理服务器。
  • 为了实现业务的快速搭建,实现能力的复用,产生了中台架构。
  • 为了实现削峰、解耦等,在服务之间加入消息队列。
  • 为了协调服务的调用者和提供者之间的关系,中间加入了注册中心。
  • 为了实现分布式事务,两阶段提交、三阶段提交方案中使用协调者作为中间角色来协调参与者的事务逻辑。

还有很多采用这种经典思想的案例,大家可以自行思考。

3. 怎么做

3.1 离线反编译工具

离线反编译工具的主要优势是安全性高,使用的体验更好。

同样推荐三款主流的离线反编译工具:IDEA 自带、 JD-GUI 、Luyten、CFR、 JAD 等。

一、IDEA 自带的反编译工具,大家在 IDEA 中点击类文件即可使用。

二、JD-GUI
JD-GUI 是一个知名的反编译工具。 使用非常方便,下载后将类文件或者 jar 包直接拖动到界面即可。

下载:JD-GUI windows 1.6.6下载


3.2 反编译示例

下面看一个简单和常见的案例:

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删除。

编辑于

关注时代Java

关注时代Java