因此,对于JVM内部字节码的验证,我有点困惑。根据Deitel和Deitel的书,Java程序经历了五个阶段(编辑、编译、加载、验证和执行)(第一章)。字节码验证器在“验证”阶段验证字节码。书中没有提到字节码验证器是类加载器的一部分。
然而,根据神谕博士,类加载器执行加载、链接和初始化的任务,并且在链接过程中必须验证字节码。
现在,Deitel和Deitel谈到的字节码验证和这份神谕文件谈到的字节码验证是否是同一个过程?
或者字节码验证发生了两次,一次是在链接过程中,另一次是由字节码验证器进行的?
如Dietel和Dietel在书中提到的描述java程序的阶段的图片(我从nobalG :)下面的答案中借用了这张图)

发布于 2014-08-28 06:11:20
不是的。
来自JVM Spec 4.10:
尽管Java编程语言的编译器必须只生成满足前几节中所有静态和结构约束的类文件,但Java虚拟机无法保证它被要求加载的任何文件都是由该编译器生成或正确形成的。
然后进行具体的验证过程。
和JVM规范5.4.1
验证(§4.10)确保类或接口的二进制表示在结构上是正确的(§4.9)。验证可能会导致加载额外的类和接口(第5.3节),但不需要使它们得到验证或准备。
指定链接引用(§4.10 )的部分--不是作为一个单独的进程,而是加载类的一部分。
当您遇到这样的问题时,JVM和JLS是很好的文档。
发布于 2014-08-28 06:12:06
没有这样的两次验证
NO,就验证而言,仔细看看用java编写的程序是如何在下面的映像中经历不同阶段的,您将看到没有这样的两次验证,但是代码只验证了一次。

发布于 2014-08-28 06:15:48
规范列出了字节码验证的4个阶段。这些步骤在功能上是不同的,不会被误解为重复相同的事情。就像多通道编译器使用每次传递来设置下一次传递一样,阶段不是重复的,而是为单一的总体目的而编排的,每个阶段都完成某些任务。
除非字节码被更改,否则没有理由对其进行两次验证。
本报告将对核查进行说明。
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10
https://stackoverflow.com/questions/25541778
复制相似问题