为什么.class文件不可读?

Des*_*PRG -1 java bytecode .class-file

编译java文件时,它会生成.class文件.现在这个.class文件具有JVM解释的字节码.当我们在文本编辑器中打开.class文件时,它不是人类可读的.现在要查看字节码,可以使用像javap这样的反汇编程序.

我的问题是,为什么我们需要反汇编字节码才能查看字节码本身?

反汇编程序实际上做了什么,将.class文件转换为人类可读的格式?

Raf*_*ter 5

Java虚拟机模拟机器.这就是为什么它被称为机器,尽管它是硬件中不存在的虚拟机器.因此,在考虑javap outout与实际Java字节代码的区别时,请考虑程序集和机器代码之间的区别:

汇编代码使用所谓的助记符来使代码具有人类可读性.然而,这样的助记符名称与机器无关,因为机器只知道如何读取和操作二进制数据.因此,我们必须组装使用助记符(及其潜在的参数)汇编其中每个这样的助记符被转换成其二进制等效.例如,为了从特定寄存器加载一个值,我们会编写类似于load 0xFF汇编的东西,而不是使用这个指令的实际二进制操作码,这可能是类似的1001 1011 1111 1111.类似地,使用Java字节代码,助记符是javap产生的,我们需要将二进制数据表示到(虚拟)机器,然后它就能够处理.只有当我们想要读取字节代码时,我们才将其反汇编为javap所代表的汇编代码.

请记住:汇编语言和javap输出存在的唯一原因是像你我这样的人不喜欢阅读二进制代码.我们接受培训,以区分我们所看到的形状,例如字母和名称.相反,机器通过读取比特流来顺序地解释数据.如上所述,这些位很难让我们阅读,这就是为什么我们宁愿以十六进制格式呈现它们:而不是1111 1111,我们宁愿写0xFF.但这仍然很难阅读,因为这样的数值并没有揭示其背景意义.0xFF仍然可能意味着一切.这就是为什么我们宁愿使用所提到的助记符,其含义是隐含的.

您可能会认为虚拟机仍然只是虚拟机,因此该机器确实可以解释助记符而不是二进制Java 字节代码.但是,这样的助记符会占用更多空间(字符串当然只是由机器表示为字节),并且它还需要比在JVM上运行的模拟机器语言花费更多时间.因此,与标准编码(例如ASCII)相比,您可以将字节代码视为奇怪的编码,其中字符集仅包含字而不是字母,其中字只是Java虚拟机使用和理解的字.显然,这个Java字节代码字符集比使用ASCII描述类文件的内容更有效.