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

Java 如何使用反射检查方法是否是静态的?,java,reflection,Java,Reflection,我只想在运行时发现一个类的静态方法,我该怎么做呢? 或者,如何区分静态方法和非静态方法。使用Modifier.isStatic(method.getModifiers()) /** *返回类或接口的公共静态方法, *包括那些在超类和接口中声明的。 */ 公共静态列表getStaticMethods(类clazz){ 列表方法=新的ArrayList(); for(方法:clazz.getMethods()){ if(Modifier.isStatic(method.getModifiers())

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

使用
Modifier.isStatic(method.getModifiers())

/**
*返回类或接口的公共静态方法,
*包括那些在超类和接口中声明的。
*/
公共静态列表getStaticMethods(类clazz){
列表方法=新的ArrayList();
for(方法:clazz.getMethods()){
if(Modifier.isStatic(method.getModifiers())){
方法:添加(方法);
}
}
返回集合。不可修改列表(方法);
}
注意:从安全角度来看,这种方法实际上是危险的。Class.getMethods“根据直接调用方的类加载器绕过[es]安全管理器检查”(请参阅Java安全编码指南第6节)

免责声明:未经测试或编译

注意
修饰符
应小心使用。表示为int的标志不是类型安全的。一个常见的错误是在一种类型的反射对象上测试修改器标志,而该对象不适用于该对象。在这种情况下,可能会在同一位置设置一个标志来表示其他一些信息。

为了充实前面(正确)的答案,下面是一个完整的代码片段,它可以满足您的需要(忽略异常):

public方法[]getStatics(c类){
方法[]all=c.getDeclaredMethods()
返回列表=新建ArrayList();
用于(方法m:全部){
if(Modifier.isStatic(m.getModifiers())){
加上(m);
}
}
return back.toArray(新方法[back.size()]);
}

您可以获得如下静态方法:

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

编辑答案:是修饰符而不是修饰符->使用Modifier.isStatic(method.getModifiers())Thx作为答案!是的,谢谢。虽然我声称这个名字是个错误的设计。修饰符不表示修饰符。但是整个班级都是一个错误的设计。顺便说一句,同样的方法也适用于字段,它还提供了一个getModifiers()方法
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()]);
}
for (Method m : MyClass.class.getMethods()) {
   if (Modifier.isStatic(m.getModifiers()))
      System.out.println("Static Method: " + m.getName());
}