2013-07-30 6 views
19

को विस्तारित करने वाली कक्षा से विधि प्राप्त करने के लिए .getDeclaredMethod का उपयोग करना, तो मान लें कि मैं Method m = plugin.getClass().getDeclaredMethod("getFile"); का उपयोग कर कक्षा से कोई विधि प्राप्त करने का प्रयास कर रहा हूं।किसी अन्य

लेकिन उस plugin वर्ग एक और वर्ग है, जो getFile विधि के साथ एक है प्रदान कर रहा है। मुझे पूरा यकीन नहीं है कि इससे NoSuchMethodException अपवाद फेंक देगा या नहीं।

मुझे कक्षा है कि plugin विस्तारित हो रहा है getFile विधि है। क्षमा करें अगर मैं उलझन में लग रहा हूं, थोड़ा थका हुआ हूं।

उत्तर

55

ऐसा लगता है कि आपको getDeclaredMethod के बजाय getMethod का उपयोग करने की आवश्यकता है।

एक विधि उद्देश्य यह है कि इस वर्ग वस्तु का प्रतिनिधित्व करती क्लास अथवा अंतरफलक निर्दिष्ट घोषित विधि को दर्शाता है रिटर्न: getDeclaredMethod के पूरे मुद्दे कि यह केवल पाता तरीकों वर्ग में घोषित आप पर यह कॉल कर रहे है ।

getMethod जबकि है:

सी कोई मेल खाते तरीकों की खोज की है। यदि कोई मिलता-जुलता विधि पाया जाता है, चरण 1 के एल्गोरिथ्म यह केवल सार्वजनिक तरीकों हालांकि मिलेगा सी

की सुपर क्लास पर पुनरावर्ती शुरू हो जाती है।

Class<?> clazz = plugin.getClass(); 
while (clazz != null) { 
    Method[] methods = clazz.getDeclaredMethods(); 
    for (Method method : methods) { 
     // Test any other things about it beyond the name... 
     if (method.getName().equals("getFile") && ...) { 
      return method; 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
+0

+1, एक बेहतर समाधान की तुलना में मैं था: विधि आप के बाद कर रहे हैं सार्वजनिक नहीं है, तो आपके सामने वर्ग पदानुक्रम खुद recurse चाहिए, पदानुक्रम में प्रत्येक वर्ग पर getDeclaredMethod या getDeclaredMethods का उपयोग कर। – rgettman

+0

यदि यह मदद करता है, तो इसका कारण यह है कि इस विधि का उपयोग पहली जगह निजी होने के कारण है। अंत तो आप संपादित करें। ठीक है, मैं संपादन का प्रयास करूंगा। – PaulBGD

+0

@Ultimate: ठीक है हाँ, यह बहुत महत्वपूर्ण है। यदि आपने इसका उल्लेख किया था तो इससे मदद मिलेगी। –

संबंधित मुद्दे