2013-05-10 22 views
1

我想在JVM啓動時加載額外的類。具體來說,應該在加載所有核心庫之後加載類(至少在rt.jarlib/ext之後)。Java - 在JVM啓動時加載額外的類

該類未被引用。它包含一個靜態塊,用於設置JVM範圍的代理,我們希望所有的URL連接都可以使用。

我試過了-Xbootclasspath/a,-Xbootclasspath/p選項。隨着-verbose:class被添加到JVM_OPTS以及由-Xbootclasspath變體創建的加載/打開輸出表明所有核心庫都被「加載」,而我的JAR只是「打開」。

在所有核心類加載完畢後,是否有強制加載類的方法 - 或者還是更好地加載JAR中的所有類?

回答

0

經過研究,我找不到比定製類加載器更好的方法。

這是我寫的。它固有地爲所有的類加載方法使用默認的類加載器,但是提供對可以發生自定義的類加載/引用的非靜態初始化器的訪問。

public class CustomClassLoader extends ClassLoader { 

    { 
     // Custom class loading goes in this non-static initializer. 
     loadClass("java.org.myorganisation.package.MyClass"); 
    } 

    public CustomClassLoader() { 
     super(CustomClassLoader.class.getClassLoader()); 
    } 

    public CustomClassLoader(ClassLoader parent) { 
     super(parent); 
    } 
} 

通過定義系統屬性-Djava.system.class.loader=com.anon.mypackage.CustomClassLoader指定自定義類加載器。

+0

在你的回答中,當你寫下「自定義類加載進入這個靜態塊。」你的意思是你只是引用靜態類來加載?還是你做了其他事情?既然現在你提出這個解決方案已經兩年了,你有沒有找到更好的方法來做到這一點? – 2015-05-16 15:07:24

+0

@AndrewBate我修改了我的描述(這是錯誤的)和代碼,雖然我現在無法測試,所以請告訴我,如果你這樣做。正如你所提到的,我很久以前就爲一個特定的用例寫了這篇文章,並且從那以後沒有重新嘗試相同的目標,所以沒有更好的選擇建議。我甚至不知道非靜態初始化是必要的,我原以爲你可以簡單地在構造函數中調用'loadClass' ......但是再一次,我希望以很好的理由解決這個問題:) – KomodoDave 2015-05-18 07:53:12