簡體   English   中英

如何在JVM中使用類加載器兩次加載類?

[英]How to load a class two times using classloader in JVM?

我在Java訪談中被問到。 眾所周知,由於父委托模型的存在,Java類加載器將只加載一次類。 所以我的答案是使用自定義類加載器加載它。 那正確嗎? 如何回答這個問題?

這取決於。 限定名稱以java.開頭的類java. 只能由引導加載程序加載,因此根本無法再次加載。 引導加載程序加載的所有其他類只能由不遵循父委派模型的自定義類加載程序實現加載,因為引導加載程序是所有加載程序的父級。

對於由ClassLoader實例加載的所有其他類,可以按照父級委托模型構造標准的類加載器,但不將該加載器作為父類。 但是,當然,您也可以使用自定義加載程序來加載它們,而不遵循委托模型。 選擇可能取決於您要如何處理該類引用的其他類,這些其他類最初是由同一加載器加載的。 您也可以重新加載它們,以創建該環境的完整副本,或嘗試將其加載重定向到原始加載器,如果存在反向引用,則會造成問題。

下面的代碼示例演示了該方法:

public class ReloadMySelf {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        final Class<?> o = ReloadMySelf.class;
        URL loc = o.getProtectionDomain().getCodeSource().getLocation();
        ClassLoader parent = o.getClassLoader().getParent();
        try(URLClassLoader cl = new URLClassLoader(new URL[]{loc}, parent)) {
           Class<?> duplicate = cl.loadClass(o.getName());
           System.out.println("original: "+o+" ("+o.getClassLoader()+')');
           System.out.println("duplicate: "+duplicate+" ("+duplicate.getClassLoader()+')');
        }
    }
}

暫無
暫無

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

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