2014-12-21 52 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

感谢您的更新。 –