了解Java中的ClassLoader

时间:2012-07-16 13:43:56

标签: java jvm classloader

我是JVM和ClassLoader的新手。我有这两个类:

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类是什么,或者如果它已经加载了怎么加载它?

2 个答案:

答案 0 :(得分:2)

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

您可以使用Thread.setContextClassLoader

更改上下文ClassLoader

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

答案 1 :(得分:1)

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