到.class文件目录下
javap -c ClassName 粗略信息
javap -v ClassName 详细信息 (或javap -verbose)
javap -p ClassName Java官方的反编译版本,更为齐全一些
如看enum的实现:
IDEA的反编译内容(反编译的.class一般都在out/production目录下):
javap -p Solution
使用javap -p明显比IDEA多了很多内容,甚至可以看到定义为enum类型的类其实是继承了Enum类,且为final的。包括内部实现都有,很是方便。
BTW,.java ——> .class称为编译的过程,平时我们打开.class也能够看到里面的内容,为什么还叫反编译出来的.class呢,这不就是编译出来的.class?
错误,真正的.class文件是字节码,是以一个字节即8bit为基本单位的数据流,原始的class文件打开后应该是一片八进制数据流(或者叫Byte),而我们平时打开的.class确是可读的,这是因为它们不是原始的.class,是经过各种Decompiler反编译原始的字节流,class文件得到的.java文件,只是为了逻辑上的共通——这些内容就是.class代表的东西,才叫的.class。
我们知道从用户自己编写的.java到真正的.class数据流其实JVM还要做很多工作,添加默认构造器,脱去语法糖,编译优化等等,即.class文件比我们写的原始.java文件多了很多东西。现在从这一份多了东西的字节流文件恢复成.java文件,不同的Decompiler有不同的实现,所以展现的细节也有有所不同。
一般而言,IDEA等IDE提供的反编译插件提供的细节就够用了,如果不够,可以尝试javap -p className试试。