मैं कार्यावधि में वर्ग लोडर स्विच करने के लिए कोशिश कर रहा हूँ:बदलें classloader
public class Test {
public static void main(String[] args) throws Exception {
final InjectingClassLoader classLoader = new InjectingClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
Thread thread = new Thread("test") {
public void run() {
System.out.println("running...");
// approach 1
ClassLoader cl = TestProxy.class.getClassLoader();
try {
Class c = classLoader.loadClass("classloader.TestProxy");
Object o = c.newInstance();
c.getMethod("test", new Class[] {}).invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
// approach 2
new TestProxy().test();
};
};
thread.setContextClassLoader(classLoader);
thread.start();
}
}
और:
public class TestProxy {
public void test() {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = ClassToLoad.class.getClassLoader();
ClassToLoad classToLoad = new ClassToLoad();
}
}
(InjectingClassLoader एक वर्ग org.apache.bcel.util का विस्तार है .ClassLoader जो कक्षाओं के संशोधित संस्करणों को उनके लिए माता-पिता से पूछने से पहले लोड करना चाहिए)
मुझे पसंद आएगा ई "दृष्टिकोण 1" और "दृष्टिकोण 2" का परिणाम बिल्कुल समान बनाने के लिए, लेकिन ऐसा लगता है कि thread.setContextClassLoader (classLoader) कुछ भी नहीं करता है और "दृष्टिकोण 2" हमेशा सिस्टम क्लासलोडर का उपयोग करता है (टीसीएल की तुलना करके निर्धारित किया जा सकता है और डीबगिंग के दौरान सीसीएल चर)।
क्या सभी कक्षाओं को नए थ्रेड उपयोग द्वारा लोड किए गए वर्गों द्वारा लोड किया जा सकता है?
नाइट: "प्रतिबिंबित"। यह देखते हुए कि संदर्भ वर्ग लोडर के बारे में प्रश्न में भ्रम है, आप शायद उल्लेख कर सकते हैं कि setContextClassLoader का कोई प्रभाव नहीं है जब तक कि थ्रेड कुछ ऑपरेशन नहीं कर रहा है जिसके लिए इसे सेट करने की आवश्यकता होती है (उदा।, एक SAXParser बनाना, JNDI लुकअप करना आदि)। –
फिक्स्ड; reflexively -> परावर्तक रूप से। धन्यवाद। –