2008-10-17 9 views
10

मैं अपवाद निम्नलिखित देख रहा हूँ जब मैं गतिशील प्रॉक्सी का उपयोग करने की कोशिशप्रॉक्सी का उपयोग करते समय कक्षा लोडर से इंटरफ़ेस दिखाई नहीं दे रहा है?

com.intellij.rt.execution.application.AppMain DynamicProxy.DynamicProxy 
Exception in thread "main" java.lang.IllegalArgumentException: interface Interfaces.IPerson is not visible from class loader 
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) 
    at DynamicProxy.Creator.getProxy(Creator.java:18) 
    at DynamicProxy.DynamicProxy.main(DynamicProxy.java:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

किसी भी विचार मैं क्या करने की जरूरत यह

उत्तर

5

समाधान के लिए अपने DynamicProxy की कोशिश करता Class.forName(youInterfaceClass.getName()) करने के लिए जब जिसके परिणामस्वरूप java.lang.Class उदाहरण से अलग है जब आप प्रॉक्सी बनाते हैं तो आप पारित होते हैं। दूसरे शब्दों में आपके पास एक ही नाम के साथ दो वर्ग वस्तुएं हैं और प्रॉक्सी सुनिश्चित नहीं है कि कौन सा सही है (इससे कोई फ़र्क नहीं पड़ता कि वे समान हैं)।

आमतौर पर, ऐसा तब होता है जब आप इंटरफ़ेस को प्रॉक्सी करने का प्रयास कर रहे हैं, दो अलग-अलग क्लासलोडर्स (यानी टोमकैट के 'सामान्य' और 'एप्लिकेशन') के माध्यम से लोड की गई लाइब्रेरी में है।

यदि यह मदद नहीं करता है, तो कृपया अपने आवेदन पर अधिक जानकारी पोस्ट करें - खासकर यदि आप किसी भी एप्लिकेशन सर्वर, स्प्रिंग या ओएसजीआई का उपयोग कर रहे हैं।

9

यदि यह वेब एप्लिकेशन है, तो आपको डायनामिक प्रॉक्सी बनाते समय वेब एप्लिकेशन क्लासलोडर का उपयोग करना चाहिए। तो, के बजाय उदाहरण के लिए:

Proxy.newProxyInstance(
    ClassLoader.getSystemClassLoader(), 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

कोशिश:

Proxy.newProxyInstance(
    this.getClass().getClassLoader(), // here is the trick 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

उदाहरण के लिए, बिल्ला वर्ग लोडर (अन्य वेब कंटेनर समान है) के पदानुक्रम पीछा कर रहा है:

 Bootstrap 
      | 
     System 
      | 
     Common 
    / \ 
    Webapp1 Webapp2 ... 

और यह वेबपैप क्लासलोडर है जिसमें आपके वेब एप्लिकेशन की/WEB-INF/कक्षा निर्देशिका में कक्षाएं और संसाधन शामिल हैं, साथ ही आपके वेब आवेदक की/WEB-INF/lib निर्देशिका के तहत JAR फ़ाइलों में कक्षाएं और संसाधन आयन।

संबंधित मुद्दे