使用 Unsafe.defineClass 定义 类 而不解析依赖关系
Defining classes using Unsafe.defineClass without resolving dependencies
由于我的程序的要求,我处于需要在运行时使用 null 类加载器(bootstrap 类加载器)定义多个 类 的情况。
这通常很容易使用像
这样的东西
unsafe.defineClass(name, bytes, 0, bytes.length, null, null);
然而,如果我需要定义 5 个不同的 类,每个都相互引用,这将不起作用。 JVM 尝试在定义这些 类 之前解决它们,从而导致 NoClassDefFoundError。
当我用 unsafe.defineClass 定义它们时,有没有办法阻止 JVM 解析 类?
如果没有,是否有可能使用 JNI 执行此操作?
这个问题类似于 ,但是提供的答案不合适,因为它包括在非空类加载器下定义 类。
Unsafe.defineClass
无法解析 classes,如 JVMS §5.4.3 中所述。常量池中的大多数符号引用仍未解析。
在 class 定义时需要满足的唯一依赖项是
- 实现的接口列表;
- 超级class.
任何一组有效的 classes 都可以按
的方式排序
- 对于正在定义的任何class或接口
C
,所有接口C
实现之前已经定义,并且C
的superclass是之前也有定义。
这意味着,如果按正确的顺序完成,可以一个接一个地定义 classes。上述条件仅在循环继承的情况下不成立(无论如何都不成立)。
但请确保不初始化 classes 或以其他方式导致class 解析,直到所有引用的classes 都是已定义.
由于我的程序的要求,我处于需要在运行时使用 null 类加载器(bootstrap 类加载器)定义多个 类 的情况。
这通常很容易使用像
这样的东西unsafe.defineClass(name, bytes, 0, bytes.length, null, null);
然而,如果我需要定义 5 个不同的 类,每个都相互引用,这将不起作用。 JVM 尝试在定义这些 类 之前解决它们,从而导致 NoClassDefFoundError。
当我用 unsafe.defineClass 定义它们时,有没有办法阻止 JVM 解析 类?
如果没有,是否有可能使用 JNI 执行此操作?
这个问题类似于
Unsafe.defineClass
无法解析 classes,如 JVMS §5.4.3 中所述。常量池中的大多数符号引用仍未解析。
在 class 定义时需要满足的唯一依赖项是
- 实现的接口列表;
- 超级class.
任何一组有效的 classes 都可以按
的方式排序- 对于正在定义的任何class或接口
C
,所有接口C
实现之前已经定义,并且C
的superclass是之前也有定义。
这意味着,如果按正确的顺序完成,可以一个接一个地定义 classes。上述条件仅在循环继承的情况下不成立(无论如何都不成立)。
但请确保不初始化 classes 或以其他方式导致class 解析,直到所有引用的classes 都是已定义.