我试图理解Java中的动态链接。阅读http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#resolution
我不太清楚字节码验证器和解析过程之间的区别。为什么验证者不执行分辨率执行的检查?
答案 0 :(得分:2)
解析过程必须由JVM完成,以了解您正在加载的代码。如果它不解析引用,则JVM无法执行这些方法。 (并且解决方案还会检查签名和事物是否仍然匹配......以防止JVM遭受堆损坏,以及随后出现的二进制不兼容问题等。)
相比之下,验证过程是关于检查字节码本身不会做错事。如果它们是由正确的编译器生成的,那么这不会发生,但是如果字节码是由错误的编译器,错误的注入程序......或者某些坏人编写字节码产生的,那么验证器提供了一系列防御。
关键区别在于分辨率至关重要,但验证是(可选的)。实际上,分离分辨率和验证意味着可以关闭验证。有一个命令行选项来执行它。 (在正常情况下关闭验证是否是一个好主意......非常值得怀疑,IMO。)