यदि कोई विधि प्रतिबिंब का उपयोग करके स्थिर है तो मैं कैसे जांच सकता हूं?


107

मैं रन-टाइम पर खोज करना चाहता हूं केवल एक क्लास के स्टैटिक मेथड्स, मैं यह कैसे कर सकता हूं? या, स्थैतिक और गैर-स्थिर तरीकों के बीच अंतर कैसे करें।

जवाबों:


182

का उपयोग करें Modifier.isStatic(method.getModifiers())

/**
 * Returns the public static methods of a class or interface,
 *   including those declared in super classes and interfaces.
 */
public static List<Method> getStaticMethods(Class<?> clazz) {
    List<Method> methods = new ArrayList<Method>();
    for (Method method : clazz.getMethods()) {
        if (Modifier.isStatic(method.getModifiers())) {
            methods.add(method);
        }
    }
    return Collections.unmodifiableList(methods);
}

नोट: यह तरीका वास्तव में सुरक्षा दृष्टिकोण से खतरनाक है। Class.getMethods "bypass [es] SecurityManager तत्काल कॉलर के क्लास लोडर पर निर्भर करता है" (जावा सुरक्षित कोडिंग दिशानिर्देशों के अनुभाग 6 देखें)।

अस्वीकरण: परीक्षण या संकलित भी नहीं।

नोट Modifierको सावधानी के साथ इस्तेमाल किया जाना चाहिए। चींटियों के रूप में प्रतिनिधित्व किए गए झंडे सुरक्षित नहीं हैं। एक सामान्य गलती एक प्रकार का प्रतिबिंब वस्तु पर एक संशोधक ध्वज का परीक्षण करना है जो यह लागू नहीं होता है। यह मामला हो सकता है कि उसी स्थिति में एक ध्वज कुछ अन्य सूचनाओं को दर्शाने के लिए सेट किया गया हो।


उत्तर संपादित करें: संशोधक के बजाय संशोधक है -> उत्तर के लिए Modifier.isStatic (method.getModifiers ()) Thx का उपयोग करें!
टेल्कॉन्टार

4
हाँ, धन्यवाद। हालांकि मैं दावा करता हूं कि नाम गलत है। संशोधक एक संशोधक का प्रतिनिधित्व नहीं करता है। लेकिन फिर पूरी कक्षा एक गलत धारणा है। और शायद प्रतिबिंब भी।
टॉम हैटिन -

btw फ़ील्ड के लिए भी काम करता है, जो एक विधि getModifiers भी प्रदान करता है ()
ग्रेगर

14

आप इस तरह से स्थिर तरीके प्राप्त कर सकते हैं:

for (Method m : MyClass.class.getMethods()) {
   if (Modifier.isStatic(m.getModifiers()))
      System.out.println("Static Method: " + m.getName());
}

5

पिछले (सही) उत्तर को बाहर निकालने के लिए, यहां एक पूर्ण कोड स्निपेट है जो आपको चाहिए (अपवादों को अनदेखा)

public Method[] getStatics(Class<?> c) {
    Method[] all = c.getDeclaredMethods()
    List<Method> back = new ArrayList<Method>();

    for (Method m : all) {
        if (Modifier.isStatic(m.getModifiers())) {
            back.add(m);
        }
    }

    return back.toArray(new Method[back.size()]);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.