[java] 리플렉션을 사용하여 메서드가 정적인지 어떻게 확인할 수 있습니까?

런타임에 클래스의 정적 메서드 만 찾고 싶습니다. 어떻게해야합니까? 또는 정적 및 비 정적 방법을 구별하는 방법.



답변

사용 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로 표시된 플래그는 형식에 안전하지 않습니다. 일반적인 실수는 적용되지 않는 반사 오브젝트 유형에서 수정 자 플래그를 테스트하는 것입니다. 같은 위치에있는 플래그가 다른 정보를 나타내도록 설정된 경우 일 수 있습니다.


답변

다음과 같은 정적 메서드를 얻을 수 있습니다.

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


답변

이전 (올바른) 답변을 구체화하기 위해 다음은 원하는 작업을 수행하는 전체 코드 스 니펫입니다 (예외 무시 됨).

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()]);
}


답변