리플렉션을 사용하여 정적 메서드 호출


198

main정적 인 메소드 를 호출하고 싶습니다 . 유형의 객체를 얻었 Class지만 해당 클래스의 인스턴스를 만들 수 없으며 static메서드 를 호출 할 수도 없습니다 main.

답변:


290
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

이 방법이 getDeclaredMethod()대신 개인용 인 경우 getMethod(). 그리고 setAccessible(true)메소드 객체를 호출 하십시오.


49

Method.invoke ()의 Javadoc에서 :

기본 메소드가 정적이면 지정된 obj 인수가 무시됩니다. null 일 수 있습니다.

당신은 어떻게됩니까

클래스 클라스 = ...;
방법 m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}

11
모든 메소드를 반복하는 대신 올바른 이름으로 getMethod를 사용하지 않는 이유는 무엇입니까?
mjaggard

11
getMethod (또는 getDeclaredMethod)를 사용하려면 매개 변수 유형을 매우 상세하게 처리해야하므로 getMethod를 사용하는 것보다 이름별로 메소드를 반복하고 찾는 것이 훨씬 쉬운 경우가 있습니다. 마이크로 효율성이 중요한지 여부에 달려 있습니다. Java 반복이 매우 빠르므로 내부 루프에서 수백만 번 메소드를 호출하지 않으면 반복이 충분히 빠릅니다.
Tony Eastwood

2
또한 실제 상황에서는 리플렉션을 사용하여 여러 번 호출하더라도 메서드를 한 번만 찾을 수 있습니다. 따라서 찾을 때 추가 오버 헤드는 중요하지 않습니다.
RenniePet

4
오버로드 된 메소드로 인해 나쁜 시간을 보냈습니다.
Ulysse Mizrahi

1
@UlysseMizrahi는 모두 일치하는 항목에 따라 다르지만 라이브러리 코드를 작성하는 경우 이름에만 의존하는 것이 위험 할 수 있습니다. 나는 보통 "주석을 받아서 클래스의 인스턴스를 반환하는 정적 메소드"와 같은 특정 주석 또는 특정 메소드 서명을 확인한 다음, 그러한 메소드가 하나만 있다고 주장한다.
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

위의 예에서 'add'는 두 정수를 인수로 취하는 정적 메소드입니다.

다음 스 니펫은 입력 1과 2로 'add'메소드를 호출하는 데 사용됩니다.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

참조 링크 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.