एक छोटी स्क्रिप्टइंजिन विकसित करने के हिस्से के रूप में, मैं प्रतिबिंबित रूप से जावा विधियों को कॉल करता हूं। स्क्रिप्ट इंजन द्वारा एक कॉल मुझे ऑब्जेक्ट विधि विधि और तर्कों की एक सरणी देता है। विधि को कॉल करने के लिए मैंने इसे Class.getMethod (नाम, तर्क प्रकार) पर कॉल के साथ हल करने का प्रयास किया।
हालांकि यह केवल तब काम करता है जब तर्क के वर्ग और विधि द्वारा अपेक्षित कक्षाएं समान होती हैं।कॉलिंग निकटतम फिटिंग विधि
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
मैं अगर वहाँ एक "सरल" जिस तरह से सही विधि प्राप्त करने के लिए पता करने के लिए, अगर तर्क प्रकार के लिए निकटतम फिट के साथ संभव चाहते हैं, या अपने आप को इस लागू करने के लिए करता है, तो मेरे पास है।
निकटतम फिट होगा:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
अद्यतन:
स्पष्ट करने के लिए मैं क्या जरूरत है: स्क्रिप्ट इंजन एक छोटी परियोजना मैं अपने खाली समय में लिखना इसलिए कोई strikt नियम मेरे पास हो रहा है पीछा करना। तो मैंने सोचा कि इंजन से बुलाए गए तरीकों का चयन उसी प्रकार जावा कंपाइलर केवल गतिशील प्रकार के साथ संकलन समय पर विधियों का चयन करता है और ऑब्जेक्ट का स्थैतिक प्रकार काम नहीं करेगा। (ऑटोबॉक्सिंग के साथ या बिना)
यही वह है जो मैं पहले उम्मीद है कि Class.getMethod() हल होगा। लेकिन Class.getMethod() को समान वर्गों के रूप में तर्क प्रकार के रूप में आवश्यक है, जैसा कि सबक्लास का उपयोग करते हुए विधि घोषित करता है, परिणामस्वरूप कोई ऐसी विधि अपवाद नहीं होगी। यह अच्छे कारणों से हो सकता है, लेकिन मेरे लिए विधि बेकार बनाता है, क्योंकि मुझे पहले से पता नहीं है कि तर्क प्रकार फिट होंगे।
क्लास.getMethods() को कॉल करने के लिए एक वैकल्पिक होगा और लौटाए गए सरणी के माध्यम से पुनरावृत्त होगा और एक फिटिंग विधि खोजने का प्रयास करें। अगर मैं नहीं है सिर्फ पहला "अच्छा" विधि है जो मैं के पार चलो ले जाना चाहते हैं हालांकि यह जटिल हो जाएगा, तो मैं आशा व्यक्त की कि वहाँ एक मौजूदा समाधान होगा जो कम से कम हैंडल पर:
- निकटतम फिट: अगर System.out.printf (स्ट्रिंग, स्ट्रिंग ...)
ऑटोबॉक्सिंग के लिए समर्थन भी अच्छा होगा।
यदि कोई कॉल हल नहीं किया जा सकता है तो यह एक अपवाद फेंक सकता है (एम (स्ट्रिंग, ऑब्जेक्ट), एम (ऑब्जेक्ट, स्ट्रिंग), args = स्ट्रिंग, स्ट्रिंग)
(यदि आपने इसे यहां तक बनाया है, तो समय लेने के लिए धन्यवाद इसे पढ़ें :-))
पहले "निकटतम" के लिए कड़े नियमों को परिभाषित है, तो कार्यान्वयन एक विस्तार है। – Bozho
बस मैं क्या सोच रहा था। लेकिन सभी पैडेंटिकली-सही उत्तरदाताओं के लिए, "निकटतम परिभाषित करें" के लिए, मुझे एक आसान मिला है: वह जिसे जावा सामान्य रूप से चुनता है (मुझे क्लास लोड पर लगता है)। –