Java reflection: getMethod(String method, Object[].class) not working -


मेरे पास निम्न कोड है:

  सार्वजनिक शून्य myMethod (ऑब्जेक्ट ... आर्ग्स) {System.out.println ("यह मेरी विधि है"); } सार्वजनिक शून्य invokeMyMethod () {विधि s = this.getClass ()। GetMethod ("myMethod", वस्तु []। वर्ग); वस्तु [] पूर्व = नया ऑब्जेक्ट [2]; पूर्व [0] = "नमस्ते"; पूर्व [1] = "वहां"; S.invoke (यह, पूर्व); }   

मुझे अपवाद java.lang.IllegalArgumentException प्राप्त हो रहा है: तर्कों की गलत संख्या क्या गलत है?

आपको इस तरह से विधि कॉल करने की आवश्यकता है:

  S.invoke (यह, नई वस्तु [] (नई वस्तु [] ("हाय", "वहां"}});   

(... या @ जॉन के उत्तर में विकल्प का उपयोग करें।)

कारण आपका वर्तमान कोड विफल हो जाता है जिस तरह से विभिन्न तरीकों को लागू किया जाता है जावा। मूलतः, T1 xxx (टी 2 ... आर्ग्स) वाक्य संवादात्मक चीनी के लिए T1 xxx (T2 [] args) । और जब आप विधियों को कॉल करते हैं, तो xxx (arg1, arg2, arg3) के लिए वाक्यकोषीय चीनी है xxx (नया टी 2 [] {arg1, arg2, arg3})

इस मामले में, आप वाराडिक पद्धति को एक ही सरणी मूल प्रकार के साथ एक अन्य वराडिक पद्धति का उपयोग करने की कोशिश कर रहे हैं, और कोड के कई संभावित व्याख्याएं हैं।

जब दो संभावित व्याख्याएं होती हैं एक वैराडीक कॉल का, जावा मानता है कि आप "सिक्वर्ड" संस्करण के बजाय कॉल के "अपग्रेड" संस्करण का उपयोग करने का प्रयास कर रहे हैं या अधिक सटीक होने के लिए, "शक्कर" व्याख्या का उपयोग अगर और केवल तभी :

  • प्रयोग किया जाता है वास्तविक तर्कों की संख्या औपचारिक मापदंडों की संख्या के बराबर नहीं है, या
  • अंतिम वास्तविक तर्क अंतिम असामान्य पैरामीटर के (अरै) प्रकार से संगत नहीं है।

    यदि आप रुचि रखते हैं , इस व्यवहार को अनुभाग में जेएलएस में निर्दिष्ट किया गया है।

    इसलिए ... मेरा समाधान गैर-वैरायडिक व्याख्या को मजबूती से काम करता है और स्पष्ट रूप से आवश्यक सरणी का निर्माण करता है। @ जॉन का समाधान सही वराडिक व्याख्या को मजबूर करके काम करता है।

Comments