杂谈:食用 .class 文件的正确方式

3,112 阅读2分钟

笔者在初学 Java 的时候,想一探 .class 文件的庐山真面目。而笔者用记事本打开 .class 文件时却遗憾地发现,内部大部分都是乱码。而打开 .java 文件时,其内容又是一切正常的。那么究竟是哪个环节出了问题呢?

计算机的文件分为字符文件和字节文件

首先需要说明的是:计算机的文件类型分为两类:字符文件字节(二进制)文件。最常用的字符文件如.txt文件。它直接存储着人可以识别的文字,汉语,英语,符号等。

但是计算机读不懂人类的文字,它只能识别出二进制的 01。那就需要把这些字符转换成字节格式,这个过程为编码。反过来,将字节按照一定规则翻译成字符的过程称之为解码(或者称反编码,反编译)。

而计算机中大部分的文件:诸如电影,音乐,图像等文件无法用简单的字符文件格式保存。因此这些文件都是字节文件保存的,而多媒体处理软件会用.avi, .mp3, .mp4, .jpeg 等编码格式规定了应该如何浏览它们。如何编码,就应当如何解码,这才能还原文件内容。

我很好奇.class文件里写了哪些内容!

无论是 .java 文件,还是 .txt 文件,它们都属于字符文件,因为里面的文字都是我们可以阅读,并理解其含义的。但为了机器能够理解我们写的 Java 程序, javac 便承担起了编译的任务,并将其转换成了 .class 文件。

我们编写的是字符而非字节

而用记事本直接打开 .class 文件,那么结果会令人失望:里面大部分的内容都是乱码。为什么会这样?正如之前所述:怎么将它编译的,就应当怎么将它解码。可是电脑并不知道 javac是如何编译它的,格式是什么。

电脑:我太难了

因此,由于编码格式错误,导致我们使用记事本查看 .class 字节码文件时,得到的大部分内容都是不可读的。

正确的编码 vs 错误的编码

所以如果你想一窥 .class 文件的真面目:不妨去试试一些软件,它们如果知道 javac 是何种方式编译的,就可以“反其道行之”,将其反编译。Jd-gui 就是一个这样的反编译工具:它能精准翻译绝大部分的内容,同时也提供将 .class 文件反向输出为 .java 文件的功能。

这起码要比乱码看着舒服多了~

附上一个传送门:java 反编译原理浅析