java - 为什么 Java 在类加载期间需要解析阶段?
问题描述
符号引用何时被方法区域中的内存引用替换?
解决方案
现在以运行时常量池的形式加载到方法区域的所有符号引用都被解析为此 JVM 加载的实际类型。如果可以解析符号引用但导致定义冲突,IncompatibleClassChangeError
则抛出 a。如果找不到引用的类,NoClassDefFoundError
则抛出 a ,它基本上包装了ClassNotFoundException
试图加载此引用的类的类加载器抛出的 a 。如果被引用的类引用了自身,ClassCircularityError
则抛出 a。解决方案可能以两种方式之一发生,这取决于 JVM 的实现者
Eager:对其他字段、方法或类的所有符号引用现在都已解析。
懒惰:符号引用的解析被推迟到第一次使用方法。如果永远不需要解析这个引用,这可能会带来一个引用不存在的类的类永远不会抛出错误。
看第 5.4.3 章的开头。分辨率,有明确说明:
Java 虚拟机指令 anewarray、checkcast、getfield、getstatic、instanceof、invokedynamic、invokeinterface、invokespecial、invokestatic、invokevirtual、ldc、ldc_w、multianewarray、new、putfield 和 putstatic 对运行时常量池进行符号引用。执行任何这些指令都需要解析其符号引用。
直接超类和直接实现的接口(或接口情况下的超接口)的解析发生在早期,并且出于上述字节码指令的目的而对符号引用的解析可以推迟。
推荐阅读
- c# - C# 试图读取或写入受保护的内存。OpenGL/OpenTK 库
- node.js - 如何使用express node js在firebase中的doc id中添加另一个集合数据
- python - PyQT5:如何将 QLineEdit 字符串从一个类传递到另一个类?
- java - com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.prj.User 类型
- azure - ADLS Gen2 中不提供软删除的解决方法
- react-native - 如何使用 Axios React Native 上传图片?
- c# - 在统一应用程序之间通信/发送数据的最佳实践?
- python - 带有ajax请求的Django
- r - 如何使用 sens.slope 函数的结果(输出)创建数据框?
- arrays - 按数组聚合组并将数量除以数组长度