编译和反编辑是指将源代码转换为目标代码的过程。在Java中,编译器将Java源代码转换为字节码,而JVM(Java虚拟机)则将字节码解释为机器语言。反编辑是指对编译后的代码进行修改,以便重新编译并生成新的可执行文件。

小白应该知道计算机语言的三种类型:机器语言、汇编语言和高级语言。其中,机器语言是计算机直接识别和执行的一种机器指令的集合,使用二进制表示;汇编语言使用助记符来代替和表示特定低级机器语言的操作;高级语言是一种人类易于理解和编写的计算机语言,它可以被翻译成机器语言或汇编语言。

汇编语言是计算机语言中的一种低级语言,它与机器语言非常接近,可以直接对硬件进行操作,生成的程序与其他语言相比具有更高的运行速度和占用更少的内存。因此,在一些对时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。机器语言和汇编语言都是几乎没有做任何语法抽象的低级语言,这种语言我们通常称之为低级语言,这种更加接近硬件,而且是不可以在不同硬件间移植的。

但是随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++、Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单、更有效率,使软件开发人员得以应付快速的软件开发的要求。高级语言是高度封装了的编程语言,与低级语言相对。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。如流行的Java、C、C++、C#、Pascal、Python、Lisp、Prolog、FoxPro、易语言、中文版的C语言习得等等,这些语言的语法、命令格式都不相同。同汇编语言一样,高级语言离机器语言更加远了,计算机无法直接识别高级语言。所以,想要让计算机执行高级语言,就需要将其转化为机器语言。

程序设计语言从机器语言到高级语言的抽象带来了以下几个主要好处:1. 高级语言接近算法语言易学易掌握;2. 高级语言为程序员提供了结构化程序设计的环境和工具使得设计出来的程序可读性好可维护性强可靠性高;3. 高级语言远离机器语言与具体计算机硬件关系不大因而所写出来的程序可移植性好重用率高;4. 由于把繁杂琐碎事务交给编译程序去做自动化程度高开发周期短且程序员得到解脱可以集中时间精力从事对于他们来说更为重要创造性劳动以提高程序质量。

编译就是将程序员写出来的高级语言转换成计算机认识并执行的低级语言过程。

Java语言的编译和反编译是编程中的两个重要概念。编译是将高级语言编写的源代码程序翻译为计算机能够解读、运行的低级语言的程序,也就是可执行文件。Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。Java语言的源文件是一个java文件,要将一个java文件,转换为二进制文件一共要经过两个步骤。首先经过前端编译器,将java文件编译成中间代码,这种中间代码就是class文件,即字节码文件。然后,在经过后端编译器,将class字节码文件,编译成机器语言。Java的前端编译器主要是javac, Eclipse JDT 中的增量式编译器 ECJ 等。Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器 。

反编译则是把已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。Java常用反编译工具有:jad、javap、cfr等 。

AD是一个相对不错的反编译工具,只需下载一个执行工具,即可实现对class文件的反编译。它可以将class文件反编译成java文件。然而,JAD已经很久没有更新了,在对Java 7生成的字节码进行反编译时,偶尔会出现不支持的问题,而在对Java 8的lambda表达式反编译时则彻底失败。

CFR(Common Fragment Runtime)是一个替代JAD的不错选择。虽然它的语法可能略显复杂,但它可以正常工作。相比之下,JAD已经很久没有更新了。你可以从以下地址获取CFR:http://www.benf.org/other/cfr/index.html

JD-GUI是一个独立的图形实用程序,用于显示“.class”文件的Java源代码。你可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。

由于我们有工具可以对Class文件进行反编译,因此,对于开发人员来说,如何保护Java程序成为一个非常重要的挑战。然而,技术总是在不断发展,有相应的技术可以应对反编译。但是,需要注意的是,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已,无法彻底防治。

典型的应对策略有以下几种:

1. 隔离Java程序,让用户接触不到你的Class文件;

2. 对Class文件进行加密,提高破解难度;

3. 代码混淆,将代码转换成功能上等价,但难于阅读和理解的形式;

4. 如阿里巴巴开源的分布式事务中间件的jar包就通过混淆技术进行了加密,反编译后内容如下:

```java

public class hudson$plugins$git$extensions$impl$GitChangeSetProperty extends hudson.model.AbstractProjectProperty {

private String url;

private String branch;

private String commitId;

private String author;

private String date;

private String comment;

private boolean isMerged;

private boolean isReverted;

private int additions;

private int deletions;

private int changes;

// ...省略getter和setter方法...

}

```