簡體   English   中英

什么類加載器“新”使用,我如何更改它?

[英]What classloader does “new” use, and how do i change it?

我正在開發一個簡單的插件系統,我基本上想控制哪個類加載器在new指令上加載一個類。 例如,我的主程序有一個jar,我在一個名為Bar.jar的額外打包jar中分發了一個類Foo.class

我看到在我的主程序中包含jar的三種不同的可能性:

  1. 使用我的主jar包Bar.jar將它包含在類路徑中。 對於插件系統來說,這顯然是不可行的
  2. 使用指向jar的URL ClassLoader加載類Foo 這對於默認的java程序員來說太熟悉,無法通過名稱手動加載類
  3. 通過-Djava.system.class.loader參數將自定義類加載器設置為System-classloader。 但我真的不想強迫用戶使用額外的參數啟動他的應用程序。

還有另外一種方法嗎? 也許是為特定類注冊Custom類加載器的東西? 或者在運行時更改Classloader的new用途? 設置ThreadContextClassLoader不起作用。

加載類時,它引用的類使用與它相同的類加載器。 這意味着要隱式控制使用的類加載器,您可以使用不同的類加載器來啟動它。 例如你的第一個Runnable。

class A {
    B b = new B();

new B將選擇用於A(或父級)的ClassLoader

設置上下文類加載器適用於類似Class.forName(name);動態查找Class.forName(name); Class.forName(Thread.currentThread().getContextClassLoader(), name);

一旦加載了類,它將始終使用它所依賴的相同類。 根據線程上下文說,不可能交換不同的類。 這意味着具有非常特定的類加載器的類可以使用更常用的類(例如,通用類來自父類),但是更常用的類不能使用它不知道的更具體的類加載器。 即ClassLoaders不知道他們的孩子。

其中一個原因是線程共享內存。 這意味着你不能說當A在一個線程中創建一個新B時,它將與另一個線程不同,因為任何一個線程都可以訪問A實例。

暫無
暫無

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

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