2012-07-16 44 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