使用 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 定义时需要满足的唯一依赖项是

  1. 实现的接口列表;
  2. 超级class.

任何一组有效的 classes 都可以按

的方式排序
  • 对于正在定义的任何class或接口C,所有接口C实现之前已经定义,并且C的superclass是之前也有定义。

这意味着,如果按正确的顺序完成,可以一个接一个地定义 classes。上述条件仅在循环继承的情况下不成立(无论如何都不成立)。

但请确保不初始化 classes 或以其他方式导致class 解析,直到所有引用的classes 都是已定义.