2014-12-21 88 views
0

我也碰到過這一點,而我已經探索Singleton模式的ClassLoader在Singleton模式

如果Singleton類是由兩個不同的類加載器加載,我們將 有2個不同的類,每一個類加載器。

我不知道如何兩個類加載器可用於JVM和如何來它。

回答

1

在Java EE中經常遇到多個ClassLoader。 Java EE應用程序服務器通過類加載器樹從已部署的War/EAR中加載類。他們這樣做的原因是將一個應用程序與其他應用程序隔離,但仍然在部署的模塊之間共享類。如果你想讓你的類成爲真正的單身人士,那麼你需要確保同一個類加載器加載你的單身人士。你可以這樣實現它

private static Class getClass(String clazz) throws ClassNotFoundException { 
     ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
     if(loader == null) 
     loader = YourSingleton.class.getClassLoader(); 
     return (loader.loadClass(clazz)); 
    } 
} 

注意java中的枚舉已經實現了單例模式。

更新你能解釋什麼是多類Loader以及它是如何解決問題的。

假設你有一個庫Foo。您項目的某些部分需要Foo_version1.jar,其他部分需要Foo_version2.jar。所以在你的classpath你有Foo_version1.jarFoo_version2.jar。現在類加載器需要從Foo加載Bar類,它將從它在classpath上找到的第一個Foo_versionX加載它。爲了解決這個問題,您需要另一個類加載器,因爲請記住,您的項目的某些部分需要Bar類,而不同的類是jar,然後是類加載器加載的類。

通過使用上面提到的代碼,確保如果超過1個類加載器嘗試加載您的類,則始終使用相同的實例。

+0

你能解釋一下什麼是多類Loader以及它是如何解決問題的。 –

+0

@SivaKumar更新 – sol4me

+0

感謝您的更新。 –