如何使用反射检查方法是否静态?


107

我只想在运行时发现类的静态方法,该怎么办?或者,如何区分静态方法和非静态方法。

Answers:


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根据直接调用者的类加载器进行检查”(请参阅​​Java安全编码准则的第6节)。

免责声明:未经测试甚至编译。

注意Modifier应谨慎使用。以int表示的标志类型不安全。一个常见的错误是在不适用于该反射对象的类型上测试修饰符标志。在相同位置设置标志以表示其他信息的情况可能会是这样。


编辑答案:是Modifier而不是ModifierS->使用Modifier.isStatic(method.getModifiers())Thx作为答案!
Telcontar

4
是的,谢谢。尽管我声称这个名称是错误的设计。修饰符不代表修饰符。但是整个班级都是一个错误的设计。而且可能也是反思。
Tom Hawtin-大头钉

顺便说一句,这同样适用于Fields,它也提供了一种方法getModifiers()
Gregor

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()]);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.