Men Java-ni yangi boshlovchiman va endigina sinf yuklagichlari tushunchasini tushuna boshladim. Hozirda log4j bilan bog'liq kontekst sinf yuklagichidan foydalanish bilan bog'liq ba'zi muammolarga duch kelmoqdaman.
Men quyidagi xatolarni olaman: 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 [java.net.URLClassLoader@105691e] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [sun.misc.Launcher$AppClassLoader@16930e2]. Could not instantiate appender named "CONSOLE".
Mening ilovam taxminan shunday ishlaydi: Init URLClassLoader #1 da tuzilgan va ba'zi sinflarni yuklaydi, bu sinflar log4j dan foydalanadi. Keyinchalik URLClassLoader #2 quriladi (uning ota-onasi sifatida URLClassLoader #1 mavjud) va yana bir nechta sinflarni yuklaydi, bu sinflar log4j dan ham foydalanadi. Ushbu sinflarni yuklash uchun URLClassLoader #2 ishlatilsa, yuqoridagi xato xabari paydo bo'ladi (bir xil muammo bilan yana bir nechtasi bor).
Men qilgan joriy yechim muammoli sinflarni yuklashdan oldin joriy mavzu kontekstli sinf yuklagichini URLClassLoader #2 ga o'rnatish va keyin uni eskisiga qaytarish edi:
ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
urlClassLoader.loadClass(...)
} finally {
thread.setContextClassLoader(loader);
}
Bu ishlayotgan bo'lsa-da, men bu to'g'ri yondashuv ekanligiga ishonchim komil emas.
Bu masala bo'yicha har qanday tushuncha qadrlanadi. Bundan tashqari, nega log4j meni mavzu konteksti sinf yuklagichi bilan aralashishga majbur qilmoqda? Nima uchun mavzuni ishlatish o'rniga sinf yuklagichiga o'tishimga ruxsat bermaysiz (va agar yo'q bo'lsa, birlamchini ishlataman)?