4

我对 JVM 和 ClassLoaders 还很陌生。我有这两个类:

public abstract class CoreModule extends Entity

public final class EventManager extends CoreModule

在程序开始时,我创建了一个EventManager. 所以我知道JVM知道什么是Entity类以及如何加载它(也就是说,它知道ClassLoader要使用什么),因为EventManager它是一个孙子。但是当一个Entity实例通过某种序列化机制传递时,它会抛出ClassNotFoundException. 我必须手动设置ClassLoader使用(Event.class.getClassLoader())。

JVM 怎么会不知道什么是Event类,或者如果它已经完成了如何加载它?

4

2 回答 2

2

实际上,JVM 并没有“神奇地”解决这个问题。这一切都基于一个系统类加载器,它会根据您使用的环境而有所不同。然后每个线程都有一个上下文 ClassLoader,它自动派生自 this。

您可以使用Thread.setContextClassLoader更改上下文 ClassLoader

如果您的序列化代码应该能够解析从上下文 ClassLoader 中不可见的类,您需要按照您的方式进行设置。

于 2012-07-16T13:57:52.973 回答
1

仅仅通过创建EventManager你的实例并没有向 JVM 展示如何加载它。实际上,您在这里不是在与 JVM 对话。您正在与一个特定的类加载器交谈,并且当反序列化时同一个类加载器不负责时,您可能会收到错误。这就是为什么您的问题完全在于 claloader 在什么时候负责。

于 2012-07-16T13:58:12.253 回答