Java 使用Unsafe.defineClass定义类而不解析依赖项

Java 使用Unsafe.defineClass定义类而不解析依赖项,java,jvm,java-native-interface,Java,Jvm,Java Native Interface,由于程序的需要,我需要在运行时使用null类装入器(引导类装入器)定义多个类 这通常是非常容易使用的东西,如 unsafe.defineClass(name, bytes, 0, bytes.length, null, null); 但是,如果我需要定义5个不同的类,每个类都相互引用,那么这就不起作用了。JVM试图在定义这些类之前解析它们,从而导致NoClassDefFoundError 当我使用unsafe.defineClass定义JVM解析类时,是否有办法防止它们? 如果没有,是否有可能

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

这通常是非常容易使用的东西,如

unsafe.defineClass(name, bytes, 0, bytes.length, null, null);
但是,如果我需要定义5个不同的类,每个类都相互引用,那么这就不起作用了。JVM试图在定义这些类之前解析它们,从而导致NoClassDefFoundError

当我使用unsafe.defineClass定义JVM解析类时,是否有办法防止它们?

如果没有,是否有可能使用JNI实现这一点


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

不安全。defineClass
不解析类,如中所述。常量池中的大多数符号引用仍未解析

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

  • 实施的接口列表
  • 超类
  • 任何有效的类集都可以按如下方式排序:

    • 对于正在定义的任何类或接口
      C
      ,所有接口
      C
      实现之前都已定义,并且
      C
      的超类之前也已定义
    这意味着,如果按照正确的顺序定义类,则可以逐个定义类。上述条件不仅适用于循环继承(无论如何都无效)


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

    您可以将它们放入jar文件并调用