Java 并非所有类都使用自定义系统类装入器

Java 并非所有类都使用自定义系统类装入器,java,dynamic-class-loaders,Java,Dynamic Class Loaders,我正在实现一个功能,它需要在几个JVM实例之间(通过网络)传递动态生成的类型(以二进制表示,用Kryo序列化)。为了正确解析加载的类型和未加载的类型,我使用了一个自定义系统类加载器(作为java-Djava.system.class.loader参数传递),其他动态创建的类加载器将其用作父类。这个自定义系统类加载器知道它的子类,如果它找不到类,可以询问这些派生类加载器是否拥有它(这与类加载器的标准层次结构相反) 这些动态生成的类型在不同JVM之间传输和加载得非常好。当我尝试反序列化引用动态生成类

我正在实现一个功能,它需要在几个JVM实例之间(通过网络)传递动态生成的类型(以二进制表示,用Kryo序列化)。为了正确解析加载的类型和未加载的类型,我使用了一个自定义系统类加载器(作为java
-Djava.system.class.loader
参数传递),其他动态创建的类加载器将其用作父类。这个自定义系统类加载器知道它的子类,如果它找不到类,可以询问这些派生类加载器是否拥有它(这与类加载器的标准层次结构相反)

这些动态生成的类型在不同JVM之间传输和加载得非常好。当我尝试反序列化引用动态生成类型之一的某个类型的实例(从光盘加载一个对应的类,对于所有JMV都是相同的)时,问题就出现了——ClassNotFoundException是由Kryo的实例引发的,该实例尝试按动态生成类型的名称
readClass

在方法
readClass
中,调用了
Class.forName
,它不使用指定的自定义类装入器(知道所有动态生成的类型),而是使用sun.misc.Launcher$AppClassLoader实例

是否可以指定一个自定义的系统范围的类加载器,以便用它加载所有的类以避免所描述的问题


更新


进一步的分析显示,
ClassLoader.getSystemClassLoader()
实际上返回指定的自定义系统类加载器。幸运的是,Kryo库支持设置自定义类加载器,专门用于在反序列化时加载类。这两个事实构成了所述问题解决方案的基础。

如果所有类都必须使用自定义类加载器加载,您将如何加载自定义类加载器

解决此问题的一种方法是创建本机检测代理。这是在加载任何类之前加载的


另一种解决方法是编译自己版本的AppClassLoader,并将其作为引导类路径的前缀,或者将其添加到
libs/annowned
目录中。

当然。。。我只是希望JVM能够分析加载java.system.class.loader本身所需的最小类,然后加载其余的所有类。Thanx,谢谢你的建议。我相信它假设你不会更改类的最小集合,因此它们不需要重新加载。它们不需要重新加载,但它们的实例可能会开始引用动态加载的多态兼容类型的实例,因此,在序列化/反序列化过程中,无法使用加载的默认类找到它们。关于类加载、本机插装代理和自定义AppClassLoader实现的主题是否有明确的参考资料?JVM规范?非常感谢。