理解Java中的类加载器
我对JVM和类加载器相当陌生。我有两门课:理解Java中的类加载器,java,jvm,classloader,Java,Jvm,Classloader,我对JVM和类加载器相当陌生。我有两门课: public abstract class CoreModule extends Entity public final class EventManager extends CoreModule 在程序开始时,我创建了EventManager的一个实例。因此我知道JVM知道什么是实体类以及如何加载它(也就是说,它知道使用什么ClassLoader),因为EventManager是一个孙子。但是当一个实体实例被某个序列化机制传递时,它抛出Class
public abstract class CoreModule extends Entity
public final class EventManager extends CoreModule
在程序开始时,我创建了EventManager
的一个实例。因此我知道JVM知道什么是实体
类以及如何加载它(也就是说,它知道使用什么ClassLoader
),因为EventManager
是一个孙子。但是当一个实体
实例被某个序列化机制传递时,它抛出ClassNotFoundException
。我必须手动设置ClassLoader
以使用(Event.class.getClassLoader()
)
为什么JVM不知道什么是
事件
类,或者如果它已经知道了如何加载它?实际上JVM并没有“神奇地”弄明白这一点。
它都基于一个系统类加载器,该加载器将根据您使用的环境而变化。然后,每个线程都有一个上下文类加载器,该加载器自动从中派生
可以使用更改的上下文类加载器
如果序列化代码应该能够解析上下文类加载器中不可见的类,则需要按照您的方式进行设置。仅通过创建
EventManager
的实例,您没有向JVM展示如何加载它。事实上,您并不是在这里与JVM对话。您正在与一个特定的类加载器交谈,当反序列化时该类加载器不负责时,您可能会得到一个错误。这就是为什么你的问题在于clasloader在什么时候负责什么。你能提供更多关于基础设施的详细信息吗?对不起,我不知道你所说的“基础设施”是什么意思。JVM本身就是Dalvik。它是Web应用程序还是桌面应用程序?您是否使用任何框架?您是否使用任何特殊类进行序列化等,@ThinkStip它几乎不是在Android手机上运行的Web应用程序/桌面应用程序。这是一个标准的Android服务。谢谢,我现在了解到,当反序列化完成时,是一个系统线程完成了,因此它不知道我的类。谢谢回答,我现在更了解类加载机制。