programing

반사를 사용하여 방법이 정적인지 어떻게 확인할 수 있습니까?

itsource 2022. 10. 4. 23:19
반응형

반사를 사용하여 방법이 정적인지 어떻게 확인할 수 있습니까?

클래스의 정적 메서드만 런타임에 검색하려면 어떻게 해야 합니까?또는 스태틱 방식과 비 스태틱 방식을 구별하는 방법에 대해 설명합니다.

사용하다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는 발신자의 클래스 로더에 따라 SecurityManager 체크를 우회합니다(Java 시큐어 코딩 가이드라인 섹션6 참조).

면책사항:테스트도 컴파일도 되지 않았습니다.

메모Modifier주의해서 사용해야 합니다.ints로 표시되는 플래그는 타입 세이프가 아닙니다.일반적인 실수는 수식자 플래그가 적용되지 않는 반사 객체의 유형으로 테스트하는 것입니다.같은 위치에 있는 플래그가 다른 정보를 나타내도록 설정되어 있는 경우가 있습니다.

다음과 같은 스태틱 방식을 얻을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/287645/how-can-i-check-if-a-method-is-static-using-reflection

반응형