मैं अलग-अलग तर्कों के साथ method.invoke(clazz, varargs) के माध्यम से प्रतिबिंब का उपयोग करके विधि कॉल करना चाहता हूं और इस तरह से केवल एक कॉल के साथ विभिन्न विधियों की कॉल का एहसास करता हूं, न कि स्पष्ट, हार्ड कोडित तर्कों के माध्यम से। फिलहाल मैं निम्नलिखित कार्य करता हूं:

... 
determine method arguments via reflection
...
if (numberOfArguments == 0) {
    method.invoke(clazzInstance, null);
} else if (numberOfArguments == 1) {
    method.invoke(clazzInstance, arg0);
} else if (numberOfArguments == 2) {
    method.invoke(clazzInstance, arg0, arg1);
} ... etc

तर्कों की संख्या की स्पष्ट रूप से जांच करने की आवश्यकता के बिना इसे और अधिक सुंदर ढंग से करने का कोई तरीका है?

2
WolfiG 9 अक्टूबर 2018, 15:57

3 जवाब

सबसे बढ़िया उत्तर

Varargs को एक सरणी के रूप में पारित किया जाता है, इसलिए आपको इस सरणी को इस तरह बनाना होगा:

var args = Arrays.asList(arg1, ...).toArray()

या

var args = List.of(arg1, ...).toArray()

या यहां तक ​​​​कि एक विधि बनाएं, अंततः जिसे आप पहले से लिख रहे हैं, varargs प्राप्त कर रहे हैं

void method(Object... args) {
    ...

उपरोक्त सभी विकल्पों में विधि का आह्वान किया गया है:

method.invoke(instance, args);

यह सब पूरे संदर्भ पर निर्भर करता है

Varargs (लगभग) को सरणियों के रूप में माना जाता है, अर्थात, type... args विधि के अंदर type[] args के समान है, संकलक इस तरह की विधि को कॉल करते समय केवल तर्कों को एक सरणी में परिवर्तित करता है।

2
user85421 9 अक्टूबर 2018, 16:27

arg0, arg1, argsN को एक Object[] सरणी में एकत्रित करें, आकार को numberOfArguments तक छोटा करें और इसे पास करें:

Object[] args = {arg0, arg1, ..., argsN};
method.invoke(clazzInstance, Arrays.copyOfRange(args, 0, numberOfArguments));
3
Andrew Tobilko 9 अक्टूबर 2018, 16:14

यदि आप जिस विधि का आह्वान कर रहे हैं, उसी प्रकार के तर्कों की परिवर्तनीय संख्या स्वीकार करें, जैसे

method(type...arg)

आप केवल एक पैरामीटर के रूप में एक सरणी का उपयोग कर सकते हैं

method.invoke(clazzInstance, arg[])

यदि तर्क अलग-अलग प्रकार के हैं, तो मैं आपको विधि (ऑब्जेक्ट [] ... ओबीजे) जैसी विधि करने की सलाह नहीं देता क्योंकि आप उन प्रकारों पर कोई प्रतिबंध नहीं लगाते हैं जिनके साथ विधि को काम करना है, और यह कर सकता है कोड को विकसित करने में कुछ त्रुटि होती है

0
robertobatts 9 अक्टूबर 2018, 16:14