我在探索Singleton Pattern
时遇到过这一点如果Singleton类由2个不同的类加载器加载,我们将会 有两个不同的类,每个类加载器一个。
我不知道两个类加载器如何用于JVM以及如何使用它。
答案 0 :(得分: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.jar
Foo_version2.jar
和Bar
。现在,类加载器需要从Foo
加载一个类Foo_versionX
,它将从它在classpath
上找到的第一个Bar
加载它。为了解决这个问题,您需要另一个类加载器,因为请记住,项目的某些部分需要来自不同jar
的{{1}}类,然后是类加载器加载的类。
通过使用上面提到的代码,您确保如果多于1个类加载器尝试加载您的类,那么将始终使用相同的实例。