我正在尝试理解 Java 中的动态链接。阅读http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#resolution
我不太明白字节码验证器和解析过程之间的区别。为什么验证者不执行解析执行的检查?
我正在尝试理解 Java 中的动态链接。阅读http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#resolution
我不太明白字节码验证器和解析过程之间的区别。为什么验证者不执行解析执行的检查?
解析过程必须由 JVM 完成,才能理解您正在加载的代码。如果它不解析引用,则 JVM 无法执行这些方法。(并且解决方案还检查签名和事物是否仍然匹配......以保护 JVM 免受堆损坏等由二进制不兼容问题引起的问题。)
相比之下,验证过程是关于检查字节码本身没有做错事。如果它们是由正确的编译器生成的,则不会发生这种情况,但如果字节码是由有缺陷的编译器、有缺陷的注入过程......或一些坏人欺骗字节码产生的,那么验证器会提供一道防线。
关键区别在于分辨率是必不可少的,但验证是(某种)可选的。事实上,将解析和验证分开意味着可以关闭验证。有一个命令行选项可以做到这一点。(关闭验证是否是个好主意......在正常情况下......非常值得怀疑,IMO。)