将编程语言编译和反编译成高级语言和低级语言。机器语言、汇编语言等低级语言。这种语言直接在计算机指令中编写命令,无需编译。机器可以理解这些语言,但程序员很难读懂它们。我们经常使用的语言C、Java、Python都是高级语言,这些语言的程序员都能看懂。机器无法理解它。简单概括就是:高级语言是程序员知道的语言,低级语言是机器知道的语言。将高级语言转换为低级语言的过程就是编译,而反编译就是将低级语言转换为高级语言。通过反编译,我们可以理解Java编译器生成的字节码,比如Synchronized(监听监听器)的实现原理、枚举、语法糖、泛型等,这些都需要借助反编译工具。javapjavap是jdk自带的反编译命令,可以对代码进行反编译,但是反编译的不是java文件。使用格式javap常用:javap-c类名-help--help-?输出这个用法信息-version版本信息-v-verbose输出附加信息-l输出行号和局部变量表-public只显示公共类和成员-protected显示受保护/公共类和成员-package显示包/受保护/公共类和成员(默认)-p-private显示所有类和成员-c反汇编代码-s输出内部类型签名-sysinfo显示正在处理的类的系统信息(路径、大小、日期、MD5哈希)-constants显示最终常量-classpath指定在哪里查找用户类文件-cp指定查找用户类文件的位置-bootclasspath覆盖引导类文件的位置并在下面写一个同步代码:publicclassSynchronizedTest{私人整数计数=0;publicvoidaddOne(){synchronized(SynchronizedTest.class){count++;}}}执行编译和反编译命令javacSynchronizedTest.javajavap-cSynchronizedTest.class直接用记事本打开SynchronizedTest.class文件,是一堆乱码文件,用sublime打开,是一串数字cafebabe0000003400170a000400120900030013070014070015010005636f756e74010001490100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100066164644f6e6501000d537461636b4d61705461626c65070014070015070016反编译后的代码:公共类com.SynchronizedTest{公共com.SynchronizedTest();代码:0:aload_01:invokespecial#1//方法java/lang/Object."":()V4:aload_05:iconst_06:putfield#2//Fieldcount:I9:returnpublicvoid添加一个();代码:0:ldc#3//classcom/yyw/oil/web/admin/controller/purchase/SynchronizedTest2:dup3:astore_14:monitorenter5:aload_06:dup7:getfield#2//字段数:I10:iconst_111:iadd12:putfield#2//Fieldcount:I15:aload_116:monitorexit17:goto2520:astore_221:aload_122:monitorexit23:aload_224:athrow25:returnExceptiontable:fromtotargettype51720any202320any}javap不会将字节码反编译成java文件,而是生成另一个可以看到的一种可以理解的字节码。可以看出synchronized修改的代码包括monitorenter和monitorexit。synchronized底层是靠两条指令来实现同步的,在这里显得比较晦涩。CFR从官网下载jar,执行如下命令:java-jarcfr-0.151.jarSynchronizedTest.class得到反编译后的java文件:publicclassSynchronizedTest{privateintcount=0;/**警告-移除了trycatchingitself-可能的行为改变。*/publicvoidaddOne(){Classclazz=SynchronizedTest.class;同步(SynchronizedTest.class){++this.count;//**MonitorExit[var1_1](不应在输出中)返回;CFR还有一些参数:参数注释--decodeenumswitch(boolean)去掉switch支持枚举的语法糖--decodelambdas(boolean)去掉lambda表达式的语法糖--decodestringswitch(boolean)去掉switch字符串支持的语法sugar等参数可以通过以下命令查看:java-jarcfr-0.151.jar--helpidea使用idea生成class文件,使用idea打开class文件即可。Idea是大多数Java程序员使用的编辑器。用idea打开文件更方便快捷。参考Java代码的编译与反编译和javap的使用