Yansıma kullanarak bir yöntemin statik olup olmadığını nasıl kontrol edebilirim?


107

Çalışma zamanında YALNIZCA bir sınıfın statik Yöntemlerini keşfetmek istiyorum, bunu nasıl yapabilirim? Veya statik ve statik olmayan yöntemler arasında nasıl ayrım yapılacağı.

Yanıtlar:


182

Kullanın 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);
}

Not: Bu yöntem aslında güvenlik açısından tehlikelidir. Class.getMethods "SecurityManager kontrollerini anında arayanın sınıf yükleyicisine bağlı olarak atlar" (Java güvenli kodlama kılavuzunun 6. bölümüne bakın).

Sorumluluk Reddi: Test edilmedi veya derlenmedi.

Dikkatli Modifierkullanılmalıdır. İnts olarak temsil edilen bayraklar tür güvenli değildir. Yaygın bir hata, bir değiştirici bayrağı, uygulanmadığı bir yansıma nesnesi türü üzerinde test etmektir. Aynı pozisyondaki bir bayrağın bazı diğer bilgileri belirtmek için ayarlanması durumu olabilir.


Yanıtı düzenleyin: DeğiştiriciS yerine Değiştirici -> Yanıt için Modifier.isStatic (method.getModifiers ()) Kullanın!
Telcontar

4
Evet, teşekkürler. İsmin yanlış bir tasarım olduğunu iddia etmeme rağmen. Değiştirici, bir değiştiriciyi temsil etmez. Ama o zaman tüm sınıf yanlış bir tasarımdır. Ve muhtemelen yansıma da.
Tom Hawtin - tackline

btw aynı şey, getModifiers ()
Gregor

14

Statik yöntemleri şu şekilde alabilirsiniz:

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

5

Önceki (doğru) yanıtı ortaya çıkarmak için, burada istediğiniz şeyi yapan tam bir kod pasajı verilmiştir (istisnalar göz ardı edilir):

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()]);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.