मेरी वर्तमान प्रोजेक्ट पर, मुझे प्रतिबिंब का उपयोग करके जावा में एक तरह की नकली कॉलबैक प्रणाली बनाने की आवश्यकता महसूस हुई है। हालांकि, मुझे वास्तव में काम करने के लिए मेरे प्रतिबिंब प्राप्त करने में समस्याएं आ रही हैं। गलती कोड इस प्रकार है:जावा: NoSuchMethodException जब विधि स्पष्ट रूप से मौजूद है
public Callback(Object parentObj, String methodName, Class<?>...parameters)
{
if(parentObj == null)
throw new IllegalArgumentException("parentObj cannot be null", new NullPointerException());
Class<?> clazz = parentObj.getClass();
// Trace debugging, see output
for(Method m : clazz.getDeclaredMethods())
if(m.getName().equals("myMethod")) System.out.println (m);
try { this.method = clazz.getMethod(methodName, parameters); }
catch(NoSuchMethodException nsme) { nsme.printStackTrace(); } // Exception caught
catch(SecurityException se) { se.printStackTrace(); }
this.parentObj = parentObj;
this.parameters = parameters;
}
जब मैं Callback
वस्तु का निर्माण, मैं इस तरह सिंटैक्स का उपयोग कर रहा हूँ:
new Callback(this, "myMethod", boolean.class)
जब मैं अपने छद्म कॉलबैक बनाने का प्रयास करें, यह NoSuchMethodException
पकड़ हिट ब्लॉक। मैंने अपनी विधियों में से किसी एक के आउटपुट को प्रदर्शित करने के लिए ऊपर कुछ ट्रेस डीबगिंग शामिल किया है। आउटपुट:
private void my.package.MyClass.myMethod(boolean)
java.lang.NoSuchMethodException: my.package.MyClass.myMethod(boolean)
at java.lang.Class.getMethod(Class.java:1605)
at my.package.other.Callback.<init>(Callback.java:63)
मुझे समस्या का पता नहीं लगा सका, इसलिए मैंने थोड़ा फायदा उठाने के लिए शिकार करना शुरू कर दिया। सबसे अच्छा मुझे मिल सकता है संकलित जेएआर और रनटाइम के बीच संस्करण संघर्ष का उल्लेख था। हालांकि, MyJar.jar/META-INF/MANIFEST.MF
में Created-By: 1.6.0_02 (Sun Microsystems Inc.)
शामिल हैं। मेरी परियोजना संकलित करने के लिए मेरा आईडीई C:\Program Files\Java\jdk1.6.0_02\bin\javac.exe
चला रहा है। मैं अपने जेएआर चलाने के लिए C:\Program Files\Java\jdk1.6.0_02\bin\java.exe
का उपयोग कर रहा हूं।
मुझे नुकसान हुआ है क्यों Class.getMethod
दावा कर रहा है कि विधि मौजूद नहीं है, लेकिन Class.getMethods
को खोजने में कोई समस्या नहीं है। मदद? :(
यही कारण है कि आप प्रतिबिंब पर भरोसा नहीं करते हैं, जो कि सबसे अच्छा अविश्वसनीय है। – quantumSoup
मैं यह नहीं कहूंगा कि यह अविश्वसनीय है, लेकिन यह जटिल और अक्षम हो सकता है। –
यह आपके संकलक साबित करने वाले किसी चीज़ की तुलना में निश्चित रूप से कम विश्वसनीय है। :-) –