杂谈:食用 .class 文件的正确方式
笔者在初学 Java 的时候,想一探 .class
文件的庐山真面目。而笔者用记事本打开 .class
文件时却遗憾地发现,内部大部分都是乱码。而打开 .java
文件时,其内容又是一切正常的。那么究竟是哪个环节出了问题呢?
计算机的文件分为字符文件和字节文件
首先需要说明的是:计算机的文件类型分为两类:字符文件和字节(二进制)文件。最常用的字符文件如.txt
文件。它直接存储着人可以识别的文字,汉语,英语,符号等。
但是计算机读不懂人类的文字,它只能识别出二进制的 0
或1
。那就需要把这些字符转换成字节格式,这个过程为编码。反过来,将字节按照一定规则翻译成字符的过程称之为解码(或者称反编码,反编译)。
而计算机中大部分的文件:诸如电影,音乐,图像等文件无法用简单的字符文件格式保存。因此这些文件都是字节文件保存的,而多媒体处理软件会用.avi
, .mp3
, .mp4
, .jpeg
等编码格式规定了应该如何浏览它们。如何编码,就应当如何解码,这才能还原文件内容。
我很好奇.class文件里写了哪些内容!
无论是 .java
文件,还是 .txt
文件,它们都属于字符文件,因为里面的文字都是我们可以阅读,并理解其含义的。但为了机器能够理解我们写的 Java 程序, javac
便承担起了编译的任务,并将其转换成了 .class
文件。
而用记事本直接打开 .class
文件,那么结果会令人失望:里面大部分的内容都是乱码。为什么会这样?正如之前所述:怎么将它编译的,就应当怎么将它解码。可是电脑并不知道 javac
是如何编译它的,格式是什么。
因此,由于编码格式错误,导致我们使用记事本查看 .class
字节码文件时,得到的大部分内容都是不可读的。
所以如果你想一窥 .class
文件的真面目:不妨去试试一些软件,它们如果知道 javac
是何种方式编译的,就可以“反其道行之”,将其反编译。Jd-gui
就是一个这样的反编译工具:它能精准翻译绝大部分的内容,同时也提供将 .class
文件反向输出为 .java
文件的功能。
附上一个传送门:java 反编译原理浅析
转载自:https://juejin.cn/post/6844904085716467726