我们可以通过javac命令将Java程序的源代码编译成Java字节码,也就是我们常说的类文件,一般理解为编译。
然而,字节码不是机器语言。为了使机器能够执行,有必要将字节码翻译成机器指令。这个过程由解释器实现,称为解释执行。
注意:不要把编译和解释执行混为一谈,后面说的后端编译过程是JVM为了提高效率而做的优化。
在不同的虚拟机实现中,执行字节码时,执行引擎通常有两种选择:解释执行(由解释器执行)和编译执行(由即时编译器生成的本地代码执行),或者两者都有。
所以你可以考虑一下Java是编译语言还是解释语言。
那为什么java不直接编译成可执行文件
实现跨平台。
Java源代码编译成字节码,再由不同平台的虚拟机解释执行,达到一次编译,到处运行的跨平台效果。
编译原理Java的编译期分为两个阶段:前端编译和后端编译。
前端编译
前端编译是指转换*的过程。java文件转换成*。类文件。
包括词法分析、语法分析、语义分析和中间代码生成。
主要有以下步骤:
在一些商业虚拟机中,Java程序最初由解释器解释和执行。当虚拟机发现某个方法或代码块运行非常频繁时,它会将这些代码识别为热代码
为了提高热点代码的执行效率,虚拟机会在运行时将这些代码编译成与本地平台相关的机器码。
完成这项任务的后端编译器称为JIT编译器。
反编译什么是反编译
因为Java编译指的是将Java源代码编译成Java字节码的过程
那么Java反编译简单来说就是指根据Java字节码翻译成源代码的过程。
为什么应该有反编译
首先这个源代码是字符编码,字节码是二进制字节流,源代码是给人看的,字节码是给虚拟机看的。
所以,要想展示给人看,就需要把字节码转换成源代码。如果你想为虚拟机执行它,你需要把源代码编译成字节码。当我们有一个类文件,想看源代码的时候,可以通过反编译来实现。
举个例子,如果你想知道一个Java语法编译后反编译是什么感觉;别人给你发一个jar包,你需要看看其中一个类是怎么写的。在这种情况下,可以考虑用Java反编译。
反编译工具在线反编译工具
1.http://www.decompiler.com/
2.http://www.javadecompilers.com/,the这个网站的主要优点是有许多反编译程序可供选择。
离线反编译工具
反编译工具
GitHub:https://github.com/java-decompiler/jd-gui官方网站:http://java-decompiler.github.io/
卢伊滕
下载地址:https://github.com/deathmarine/Luyten/releases
阿尔萨斯
Https://arthas.aliyun.com/doc/,官方网站
可以使用jad命令将JVM中运行的类的字节码反编译成java代码。这个工具非常好用,强烈推荐。
其他工具javap
javap是jdk自带的工具,可以反编译代码或者查看Java编译器生成的字节码,通过javap -help直接查看其使用情况。
用法: javap