Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java中的类加载器_Java_Jvm_Classloader - Fatal编程技术网

理解Java中的类加载器

理解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

我对JVM和类加载器相当陌生。我有两门课:

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服务。谢谢,我现在了解到,当反序列化完成时,是一个系统线程完成了,因此它不知道我的类。谢谢回答,我现在更了解类加载机制。