Несколько классов ClassLoaders обычно встречаются в Java EE. Серверы приложений 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 уже реализует одноэлементный узор.
Обновлено Не могли бы вы объяснить, что такое многозарядный загрузчик и как он разрешает проблему.
Скажем, у вас есть библиотека Foo
. Для части вашего проекта требуется Foo_version1.jar
, а для какой-либо другой части требуется Foo_version2.jar
. Итак, в вашем classpath
у вас есть Foo_version1.jar
и Foo_version2.jar
. Теперь загрузчик классов должен загрузить класс Bar
от Foo
, он загрузит его с первого Foo_versionX
, который он найдет на classpath
. Чтобы решить эту проблему, вам понадобится другой загрузчик классов, потому что помните, что для части вашего проекта требуется класс Bar
из разных jar
, а затем тот, который загружается загрузчиком классов.
Используя приведенный выше код, вы убедитесь, что если более 1 загрузчик классов попытается загрузить ваш класс, то всегда будет использоваться один и тот же экземпляр.
Не могли бы вы объяснить, что такое многоклассный загрузчик и как он разрешает проблему. –
@SivaKumar обновлен – sol4me
Спасибо за ваше обновление. –