2012-01-12 4 views
2

자바 리플렉션을 사용하여 변수 인수가있는 메소드를 호출하려고합니다. 여기리플렉션을 사용하여 java에서 변수 인수가있는 메소드를 호출하는 방법은 무엇입니까?

public class TestClass { 

public void setParam(N ... n){ 
    System.out.println("Calling set param..."); 
} 

호출하는 코드 것 :

try { 
     Class<?> c = Class.forName("com.test.reflection.TestClass"); 
     Method method = c.getMethod ("setParam", com.test.reflection.N[].class); 
     method.invoke(c, new com.test.reflection.N[]{}); 

나는 "인수 잘못된 번호"의 형태로, IllegalArgumentException를 얻고 난 마지막 줄에서 다음 방법을 호스트하는 클래스이다 호출 호출. 내가 뭘 잘못하고 있는지 모르겠다.

모든 포인터가 제공됩니다.

  • 감사

답변

9
public class Test { 

public void setParam(N... n) { 
    System.out.println("Calling set param..."); 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws Exception { 
    Test t=new Test(); 
    Class<?> c = Class.forName("test.Test"); 
    Method method = c.getMethod ("setParam", N[].class); 
    method.invoke(t, (Object) new N[]{}); 
} 
} 

작품.

  1. 은 N은 []
  2. 전화가없는 클래스
+0

'(Object) '에 캐스트하지 않고 시도했습니다 - 당신과 같은 예외가 생깁니다. 그냥 캐스팅을 추가하면 (그리고 올바른 포인트 1 번) 괜찮을 것입니다. – gorootde

+0

바로 위에 Object []에 대한 캐스트가 없습니다. 엄청 고마워. – Shamik

+0

@Shamik : 전화하려는 방법을 알고 있다면 dp4j를 사용하여 이러한 문제를 피할 수 있습니다. – simpatico

3

는 methd 호출 한 사용자의 코드에는 TestClass 예를 없다. TestClass 자체가 아니라 TestClass 인스턴스가 필요합니다. newInstance()c으로 호출하고이 호출의 결과를 method.invoke()의 첫 번째 인수로 사용하십시오.

는 또한, 배열이 하나 개의 인수, 그리고 가변 인자로 간주되어 있는지 확인하기 위해, 당신은 객체 캐스팅해야합니다 나를 위해

m.invoke(testClassInstance, (Object) new com.test.reflection.N[]{}); 
+0

나는 그렇게 생각하고 이전 것을 시도에, 인스턴스에서 호출 Object로 캐스트. 여기 내가 한 일이있다. 클래스 c = Class.forName ("com.test.reflection.TestClass"); \t \t \t 개체 iClass = c.newInstance(); 메서드 메서드 = c.getMethod ("setParam", com.test.reflection.N []. class); method.invoke (iClass, new com.test.reflection.N [] {}); "잘못된 인수 수"예외가 발생합니다. – Shamik

+0

내 편집보기 나는 그것을 테스트하고 작동합니다. –

+0

덕분에 많은 도움을 주셔서 감사합니다. – Shamik

관련 문제