2010-03-18 11 views
150

का उपयोग कर एक स्थिर विधि का आह्वान करना मैं main विधि को स्थिर करना चाहता हूं जो स्थैतिक है। मुझे Class टाइप करने का ऑब्जेक्ट मिला, लेकिन मैं उस वर्ग का उदाहरण बनाने में सक्षम नहीं हूं और static विधि main को भी आमंत्रित करने में सक्षम नहीं हूं।प्रतिबिंब

+3

हमें कोड दिखाएं, कृपया। –

उत्तर

213
// String.class here is the parameter type, that might not be the case with you 
Method method = clazz.getMethod("methodName", String.class); 
Object o = method.invoke(null, "whatever"); 

मामले में विधि निजी इस्तेमाल के getDeclaredMethod() बजाय getMethod() है। और विधि ऑब्जेक्ट पर setAccessible(true) पर कॉल करें। Method.invoke() की

9
String methodName= "..."; 
String[] args = {}; 

Method[] methods = clazz.getMethods(); 
for (Method m : methods) { 
    if (methodName.equals(m.getName())) { 
     // for static methods we can use null as instance of class 
     m.invoke(null, new Object[] {args}); 
     break; 
    } 
} 
+10

क्यों सभी विधियों के माध्यम से लूपिंग के बजाय सही नाम के साथ getMethod का उपयोग नहीं करें? – mjaggard

+9

कभी-कभी लूप के लिए बहुत आसान है और getMethod का उपयोग करने के लिए विधि से विधि ढूंढें क्योंकि getMethod (या getDeclaredMethod) के लिए आवश्यक है कि आप पैरामीटर प्रकारों को बहुत विस्तार से कार्य करें। यह केवल निर्भर करता है कि सूक्ष्म दक्षता मायने रखती है - जावा पुनरावृत्ति बहुत तेज़ है, जब तक कि आप कुछ आंतरिक लूप में विधि को कई बार कॉल नहीं कर रहे हैं तो पुनरावृत्ति पर्याप्त तेज़ी से –

+2

होगी और अधिक वास्तविक जीवन की स्थिति में आप शायद ही खोज रहे हों एक बार विधि भी भले ही आप इसे कई बार आमंत्रित करने के लिए प्रतिबिंब का उपयोग करने जा रहे हैं। तो इसे खोजने के दौरान अतिरिक्त ओवरहेड असीमित है। – RenniePet

34

fromthe जावाडोक:

है कि अंतर्निहित विधि स्थिर है, तो निर्दिष्ट obj तर्क नजरअंदाज कर दिया है। यह शून्य हो सकता है।

क्या होता है जब आप

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args)