Я новичок в Java и только начинаю понимать концепцию загрузчиков классов. Прямо сейчас у меня возникают некоторые проблемы с log4j в отношении использования потокового загрузчика классов.
Я получаю следующие ошибки: A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable. The class "org.apache.log4j.Appender" was loaded by [[email protected]] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [[email protected]]. Could not instantiate appender named "CONSOLE".
Мое приложение работает примерно так: при инициализации URLClassLoader # 1 создается и загружает некоторые классы, эти классы используют log4j. Позже создается URLClassLoader # 2 (который имеет URLClassLoader # 1 как родительский) и загружает еще несколько классов, эти классы также используют log4j. Когда URLClassLoader # 2 используется для загрузки этих классов, появляется вышеуказанное сообщение об ошибке (есть еще одна проблема с той же проблемой).
Текущее обходное решение, которое я делал, - установить текущую загрузку класса контекста потока в URLClassLoader # 2 перед загрузкой проблемных классов и сбросить его до старого:
ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
urlClassLoader.loadClass(...)
} finally {
thread.setContextClassLoader(loader);
}
Пока это работает, я не уверен, правильно ли он подходит.
Любое понимание этого вопроса будет оценено по достоинству. Кроме того, почему log4j заставляет меня возиться с потоковым загрузчиком классов классов? Почему бы не позволить мне пройти загрузчик классов (и использовать по умолчанию один, когда я этого не делаю) вместо того, чтобы использовать один поток?