首页 > 解决方案 > 使用 Unsafe.defineClass 定义类而不解析依赖项

问题描述

由于我的程序的要求,我需要在运行时使用 null 类加载器(引导类加载器)定义多个类。

这通常很容易使用类似的东西

unsafe.defineClass(name, bytes, 0, bytes.length, null, null);

但是,如果我需要定义 5 个不同的类,每个类都相互引用,这不起作用。JVM 尝试在定义这些类之前解析它们,从而导致 NoClassDefFoundError。

当我用 unsafe.defineClass 定义类时,有没有办法阻止 JVM 解析类?

如果没有,是否有可能使用 JNI 来做到这一点?

这个问题类似于这个问题但是提供的答案不合适,因为它包括在非空类加载器下定义类。

标签: javajvmjava-native-interface

解决方案


Unsafe.defineClass 不解析类,如JVMS §5.4.3中所述。常量池中的大部分符号引用仍未解决。

在类定义时需要满足的唯一依赖项是

  1. 实现的接口列表;
  2. 超类。

任何有效的类集都可以按以下方式排序

  • 对于正在定义的任何类或接口C,所有接口C实现之前都已经定义,并且C之前也定义了超类。

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

但请确保在定义所有引用的类之前不要初始化类或以其他方式导致类解析。


推荐阅读