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


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는 즉각적인 호출자의 클래스 로더에 따라 검사합니다"(Java 보안 코딩 지침의 섹션 6 참조).

면책 조항 : 테스트 또는 컴파일되지 않았습니다.

주의해서 Modifier사용해야합니다. int로 표시된 플래그는 형식에 안전하지 않습니다. 일반적인 실수는 적용되지 않는 반사 오브젝트 유형에서 수정 자 플래그를 테스트하는 것입니다. 같은 위치에있는 플래그가 다른 정보를 나타내도록 설정된 경우 일 수 있습니다.


대답을 편집하십시오 : ModifierS 대신 Modifier-> Use Modifier.isStatic (method.getModifiers ()) Thx for the Answer!
Telcontar

4
네, 감사합니다. 이름이 잘못된 디자인이라고 주장하지만. 수정자는 수정자를 나타내지 않습니다. 그러나 전체 수업은 잘못된 설계입니다. 그리고 아마도 반사도.
Tom Hawtin-tackline

btw는 필드에서도 동일하게 작동하며 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()]);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.