प्रतिबिंब का उपयोग करके एक स्थिर विधि का उपयोग करना


198

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

जवाबों:


290
// 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)विधि वस्तु पर कॉल करें ।


49

Method.invoke () से Javadoc का:

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

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

क्लास क्लैश = ...;
विधि m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (शून्य, args)

13
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;
    }
}

11
क्यों नहीं सभी तरीकों के माध्यम से पाशन के बजाय सही नाम के साथ getMethod का उपयोग करें?
mjaggard

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

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

4
हालांकि, अतिभारित तरीकों के साथ एक बुरा समय होता है।
उलेसे मिजराही

1
@UlysseMizrahi यह सब इस बात पर निर्भर करता है कि आप किस चीज से मेल खाते हैं, लेकिन हां अगर आप लाइब्रेरी कोड लिख रहे हैं, तो केवल नाम पर भरोसा करना खतरनाक हो सकता है। मैं आम तौर पर एक विशिष्ट एनोटेशन, या एक विशेष विधि हस्ताक्षर की जांच करता हूं, जैसे "स्थिर विधि जो एक स्ट्रिंग लेता है और कक्षा का एक उदाहरण देता है", फिर जोर देकर कहते हैं कि केवल एक ही ऐसा तरीका है।
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

उपरोक्त उदाहरण में, 'ऐड' एक स्थिर विधि है जो दो पूर्णांकों को तर्क के रूप में लेती है।

निम्नलिखित स्निपेट का उपयोग इनपुट 1 और 2 के साथ 'ऐड' पद्धति को कॉल करने के लिए किया जाता है।

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

संदर्भ लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.