簡體   English   中英

並非所有類都使用自定義系統類加載器

[英]A custom system class loader is not used by all classes

我正在實現一個功能,需要在多個JVM實例(通過網絡)之間傳遞動態生成的類型(以二進制表示形式,與Kryo序列化)。 為了正確解析加載的類型和不加載的類型,我使用自定義系統類加載器(作為java -Djava.system.class.loader參數傳遞),其他動態創建的類加載器用作父類。 這個自定義系統類加載器知道它的子類,如果它找不到類,這些派生類加載器可以被詢問是否有它(這與類加載器的標准層次結構相反)。

這些動態生成的類型可以在不同的JVM之間進行傳輸和加載。 當我嘗試反序列化某個類型的實例(從磁盤加載相應的類並且對於所有JMV是相同的)引用其中一個動態生成的類型時出現問題 - 由Kryo的實例引發ClassNotFoundException,它試圖readClass按動態生成的類型的名稱。

在方法readClass有一個對Class.forName的調用,而Class.forName又不使用指定的自定義類加載器(知道所有動態生成的類型)而是使用sun.misc.Launcher $ AppClassLoader實例。

是否可以指定一個自定義的系統范圍的類加載器,以便所有類都加載它以避免所描述的問題?


更新

進一步分析顯示ClassLoader.getSystemClassLoader()實際上返回指定的自定義系統類加載器。 幸運的是,Kryo庫支持設置自定義類加載器,專門用於在反序列化時加載類。 這兩個事實構成了解決所述問題的基礎。

如果所有類都必須使用該類加載器進行編碼,您將如何加載自定義類加載器?

解決此問題的一種方法是創建本機檢測代理。 這是在加載任何類之前加載的。

另一種方法是編譯自己的AppClassLoader版本並將其作為引導類路徑的前綴或將其添加到libs/endorsed目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM