单例模式中的ClassLoader

时间:2014-12-21 12:54:13

标签: java singleton classloader

我在探索Singleton Pattern

时遇到过这一点
  

如果Singleton类由2个不同的类加载器加载,我们将会   有两个不同的类,每个类加载器一个。

我不知道两个类加载器如何用于JVM以及如何使用它。

1 个答案:

答案 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.jarBar。现在,类加载器需要从Foo加载一个类Foo_versionX,它将从它在classpath上找到的第一个Bar加载它。为了解决这个问题,您需要另一个类加载器,因为请记住,项目的某些部分需要来自不同jar的{​​{1}}类,然后是类加载器加载的类。

通过使用上面提到的代码,您确保如果多于1个类加载器尝试加载您的类,那么将始终使用相同的实例。