什么是编译
- 利用编译程序从源语言编写的
源程序
产生目标程序
的过程。 - 用
编译程序产生目标程序
的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。 编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
什么是反编译
计算机软件反向工程(Reverse engineering)
也称为计算机软件还原工程
,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。
Java中的编译与反编译
有时候我们想要查看class文件的具体内容,这个时候我们就需要借助反编译。还有现在越来越多的语法糖被加入到JDK当中,有时候我们想要知道一些具体实现细节,这个时候也需要用到反编译。
编译
javac
javac 是java语言编程编译器
。全称java compiler
。javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。当编译源文件时,编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。
1 | 用法: javac <options> <source files> |
编译一个java文件,可以看到当前目录下生成了一个Test.class文件。
javac Test.java
如果这个时候我们只有Test.class文件,想要去看到源码,那么我们可以借助反编译工具来实现。
反编译
javap
javap是JDK给我们提供的一个反编译工具,通过反编译class文件,我们可以看到这个class文件对应的源代码。
1 | 用法: javap <options> <classes> |
我们可以使用javap Test.class
命令来对class文件来进行反编译,反编译后的结果如下:
1 | Compiled from "Test.java" |
一般常用的参数是 -v, -l, -c
这三个。
javap -v Test.class 结果:
1 | Classfile /E:/software/myBlog/Test.class |
javap -c Test.class 结果:
1 | Compiled from "Test.java" |
javac -l Test.class 结果:
1 | Compiled from "Test.java" |
jad
我们可以使用 jad Test.class
来反编译Test.class,会生成一个jad文件,输出结果如下:
1 | // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. |