2012-07-16 45 views
4

我对JVM和ClassLoaders相当陌生。我有以下两类:了解Java中的ClassLoaders

public abstract class CoreModule extends Entity 

public final class EventManager extends CoreModule 

在节目的一开始,我创建的EventManager一个实例。所以我知道JVM知道类是什么以及如何加载它(也就是说,它知道使用什么ClassLoader),因为EventManager是一个大孩子。但是当一个Entity实例被一些序列化机制传递时,它会抛出ClassNotFoundException。我必须手动设置ClassLoader才能使用(Event.class.getClassLoader())。

怎么JVM不知道类是什么Event或如何加载它,如果它已经做到了?

+0

你能提供更多关于基础设施的细节吗? – kosa 2012-07-16 13:51:08

+0

对不起,但我不知道你的意思是“基础设施”。 JVM本身是Dalvik。 – m0skit0 2012-07-16 13:53:44

+0

它是Web应用程序还是桌面应用程序?您是否在使用任何框架?你是否使用任何特殊的课程序列化等, – kosa 2012-07-16 13:56:25

回答

2

实际上,JVM并没有“神奇地”弄清楚这一点。 它基于系统类加载器,它将根据您使用的环境而有所不同。然后每个线程都有一个上下文ClassLoader,它自动从中派生出来。

上下文ClassLoader可以使用Thread.setContextClassLoader

改变,如果您的序列代码应该能够解决从你需要设置你的方式的上下文ClassLoader不可见的类。

+0

谢谢,我现在明白,当反序列化完成时,它是一个系统线程,它并不知道我的课程。 – m0skit0 2012-07-16 14:15:09

1

只需创建EventManager的实例,您就不会显示JVM如何加载它。实际上,你不是在这里与JVM交谈。您正在与一个特定的类加载器进行通信,并且在反序列化时同一个类加载器不负责的情况下,您可能会遇到错误。这就是为什么你的问题是关于什么时候clasloader负责的问题。

+0

感谢您的回答,我现在理解班级加载机制好得多。 – m0skit0 2012-07-16 14:15:30