런타임에 클래스의 정적 메서드 만 찾고 싶습니다. 어떻게해야합니까? 또는 정적 및 비 정적 방법을 구별하는 방법.
답변
사용 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()]);
}