मैं एक दुभाषिया के माध्यम से कोड के कुछ गतिशील आमंत्रण पर काम कर रहा हूं, और मैं JLS section 15.12 में चर्चा के अनुसार विधि समाधान के चिपचिपा बदसूरत क्षेत्रों में जा रहा हूं।जावा: रनटाइम विधि संकल्प
एक विधि चुनने का "आसान" तरीका तब होता है जब आप सभी तर्कों के सटीक प्रकार जानते हैं, जिस बिंदु पर आप Class.getDeclaredMethod(String name, Class[] parameterTypes)
का उपयोग कर सकते हैं। शायद आपको विधि पहुंच और कक्षा के सुपरक्लास/superinterfaces की जांच करनी है।
लेकिन यह निम्नलिखित मामलों में से किसी को कवर नहीं करता, तो यह एक तरह से बेकार है:
- मुक्केबाजी/unboxing पुरातन
- उपप्रकार
- varargs
- एक अशक्त तर्क (हो सकता है जो किसी भी प्रकार का, जब तक कि दुभाषिया अन्यथा नहीं जानता; संकलन-समय पर किसी भी अस्पष्टता को कक्षा/इंटरफ़ेस में नल कास्टिंग करके समाप्त किया जाएगा)
- आदिम प्रकार रूपांतरण (जावा का हिस्सा नहीं, लेकिन स्वीकार्य भाषाओं का संदर्भ - उदा। राइनो जावास्क्रिप्ट जहां सभी नंबरों हैं फ्लोटिंग प्वाइंट, तो जावा कोड एक
int
लग सकता है, लेकिन फोन करने वाले एक नंबर जो या तो एकint
या एकdouble
)
(पहले की एक त्वरित उदाहरण के लिए नीचे देखें में गुजरता तीन)
तो अब मैं अपने ही विधि संकल्प पुस्तकालय लिखने के लिए है ...
इस में सहायता के लिए किसी भी अच्छी तरह से ज्ञात ढांचे पुस्तकालय है?
package com.example.test.reflect;
import java.lang.reflect.Method;
public class MethodResolutionTest {
public void compute(int i) { /* implementation... */ }
public void compute(Long l) { /* implementation... */ }
public void compute(Object obj) { /* implementation... */ }
public void compute(String... strings) { /* implementation... */ }
public static void main(String[] args) {
Class<?> cl = MethodResolutionTest.class;
/* these succeed */
findAndPrintMethod(cl, "compute", int.class);
findAndPrintMethod(cl, "compute", Long.class);
findAndPrintMethod(cl, "compute", Object.class);
findAndPrintMethod(cl, "compute", String[].class);
/* these fail */
findAndPrintMethod(cl, "compute", Integer.class);
findAndPrintMethod(cl, "compute", long.class);
findAndPrintMethod(cl, "compute", MethodResolutionTest.class);
findAndPrintMethod(cl, "compute", String.class, String.class);
}
private static void findAndPrintMethod(Class<?> objectClass,
String methodName, Class<?>... parameterTypes)
{
try {
Method method = findMethod(objectClass, methodName,
parameterTypes);
System.out.println(method.toString());
}
catch (SecurityException e) {
e.printStackTrace();
}
catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private static Method findMethod(Class<?> objectClass,
String methodName, Class<?>[] parameterTypes)
throws SecurityException, NoSuchMethodException
{
return objectClass.getDeclaredMethod(methodName, parameterTypes);
}
}
[यह उत्तर उपप्रकारों जैसे आपके कुछ मामलों को संभालता है] (http://stackoverflow.com/questions/2580665/java-getmethod-with-superclass-parameters-in-method/2580699#2580699)। –
@ जोनाथन: मुझे पता है कि Isssignable से है। मुझे उपप्रकार और मुक्केबाजी/अनबॉक्सिंग के साथ काम करने वाला कुछ घर मिला। तब मैंने varargs में शुरू किया और यह बुरा हो गया, और मैंने सोचा, "एक मिनट रुको, मैं यह सब क्यों कर रहा हूँ?" इसलिए मैं विशेष रूप से एक पूर्व-मौजूदा पुस्तकालय की तलाश में हूं। (या कम से कम पूर्व-मौजूदा परीक्षण मामलों का एक अच्छा सेट) अन्यथा मैं इसे अपने आप कर सकता हूं, लेकिन यह एक बड़ा दर्द है। –
जब तक आपको एक मीठी लाइब्रेरी नहीं मिलती, मुझे लगता है कि जो कुछ भी आप करते हैं वह बदसूरत और पढ़ने के लिए कठिन होगा। –