我也碰到过这一点,而我已经探索Singleton模式的ClassLoader在Singleton模式
如果Singleton类是由两个不同的类加载器加载,我们将 有2个不同的类,每一个类加载器。
我不知道如何两个类加载器可用于JVM和如何来它。
我也碰到过这一点,而我已经探索Singleton模式的ClassLoader在Singleton模式
如果Singleton类是由两个不同的类加载器加载,我们将 有2个不同的类,每一个类加载器。
我不知道如何两个类加载器可用于JVM和如何来它。
在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.jar
和Foo_version2.jar
。现在类加载器需要从Foo
加载Bar
类,它将从它在classpath
上找到的第一个Foo_versionX
加载它。为了解决这个问题,您需要另一个类加载器,因为请记住,您的项目的某些部分需要Bar
类,而不同的类是jar
,然后是类加载器加载的类。
通过使用上面提到的代码,确保如果超过1个类加载器尝试加载您的类,则始终使用相同的实例。
你能解释一下什么是多类Loader以及它是如何解决问题的。 –
@SivaKumar更新 – sol4me
感谢您的更新。 –