详解Javac编译与反编译

Javac是一种编译器,它的作用是将符合Java语言规范的源代码转化成符合Java虚拟机规范的Java字节码,下面为大家详细讲解一下java中的编译与反编译。

基本概念

我们可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件,这是我们通常意义上理解的编译。但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令,这个过程是通过解释器实现的,叫解释执行。注意:大家别把编译和解释执行混淆了,而后面所说的后端编译过程是JVM为提高效率做的优化,在不同的虚拟机实现中,执行引擎在执行字节码的时候,通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备。所以大家可以思考下,Java到底是属于编译型语言还是解释器语言呢?那为什么java不直接编译成可执行文件呢,其实主要还是为了实现跨平台。Java源码通过编译成字节码,然后通过不同平台的虚拟机解释执行,从而实现一次编译,到处运行的跨平台的效果。

编译原理

Java语言的编译期分为前端编译和后端编译两个阶段

前端编译

前端编译是指把*.java文件转变成*.class文件的过程,包括词法分析、语法分析、语义分析与中间代码生成。

主要有下面几个步骤:

后端编译

在部分商用虚拟机中,Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为热点代码

为了提高热点代码的执行效率,在运行时, 虚拟机将会把这些代码编译成与本地平台相关的机器码

完成这个任务的后端编译器称为即时编译器(JIT编译器)

反编译

什么是反编译

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

那么Java 反编译简单说就是指根据 Java 字节码翻译成源码的过程

为什么要有反编译

首先这个源码是字符编码,字节码是二进制字节流,并且源码是给人看的,字节码是给虚拟机看的

因此如果想给人看,需要将字节码转为源码。如果想给虚拟机执行,需要将源码编译成字节码,当我们有类文件想看源码时,可以采用反编译的方式实现

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

反编译工具

JD-GUI

GitHub :https://github.com/java-decompiler/jd-gui

官网:http://java-decompiler.github.io/

Java编译与反编译Java编译与反编译

下载后将类文件或者 jar 包直接拖动到界面即可

Luyten

下载地址:https://github.com/deathmarine/Luyten/releases

Arthas

官网:https://arthas.aliyun.com/doc/

可以使用 jad 命令将 JVM 中运行的 class 的 byte code 反编译成 java 代码

javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码

直接通过javap -help查看其用法

用法: javap  
其中, 可能的选项包括:
 -help  --help  -?        输出此用法消息
 -version                 版本信息
 -v  -verbose             输出附加信息
 -l                       输出行号和本地变量表
 -public                  仅显示公共类和成员
 -protected               显示受保护的/公共类和成员
 -package                 显示程序包/受保护的/公共类
                          和成员 (默认)
 -p  -private             显示所有类和成员
 -c                       对代码进行反汇编
 -s                       输出内部类型签名
 -sysinfo                 显示正在处理的类的
                          系统信息 (路径, 大小, 日期, MD5 散列)
 -constants               显示最终常量
 -classpath         指定查找用户类文件的位置
 -cp                指定查找用户类文件的位置
 -bootclasspath     覆盖引导类文件的位置

基本使用:

javac Test.java
javap -c Test.class

jclasslib

jclasslib 是一种可视化的字节码查看工具,可以直接在 IDEA 插件安装

安装以后,在 IDEA 编译源码后,可以选择 View” ->“Show Bytecode With Jclasslib即可查看字节码

可以直观地看到 class 文件包含基本信息、常量池、接口信息、字段信息、方法信息和属性信息

其中方法信息又包含行号表、局部变量表,异常表等

要读懂字节码指令涉及的知识很多,之后的文章会通过案例详细讲解class文件结构和字节码指令的执行过程

推荐两本非常经典的图书:《深入理解 Java 虚拟机》、《Java 虚拟机规范》

反编译示例

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

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 目录中寻找该类,双击打开,得到下面的反编译源码:

public class ForEachDemo {
   public ForEachDemo() {
   }

   public static void main(String[] args) {
       List data = new ArrayList();
       data.add("a");
       data.add("b");
       Iterator var2 = data.iterator();

       while(var2.hasNext()) {
           String str = (String)var2.next();
           System.out.println(str);
       }

   }
}

从上述反编译代码可以清楚地看到,原始代码中没有编写构造方法时,编译器会自动生成一个默认构造方法;foreach 循环来遍历 list 时,底层通过 iterator 来实现

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/222148.html<

(0)
运维的头像运维
上一篇2025-04-15 08:55
下一篇 2025-04-15 08:56

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注