2012-04-10 5 views
22

나는 반사적으로 자바에서이 메소드를 호출하는 것을 시도하고있다 :null을 인수로 사용하여 메소드를 반사적으로 호출하려면 어떻게해야합니까?

public void setFoo(ArrayList<String> foo) { this.foo = foo; } 

문제가 foo는이 null가되도록 내가 null로 null을 전달 할 것입니다.

그러나,이 인수가없는, 내가 IllegalArgumentException (wrong number of arguments)를 얻을 수 있다고 가정합니다 다음과 같은 접근 방식 :

method.invoke(new FooHolder(), null); 
// -----------------------------^ - I want null to be passed to the method... 

방법이 수행됩니다?

+2

'varargs'가 잘못되었을 때. – biziclop

답변

51

은 컴파일러 경고가 문제의 당신이 인식해야

method.invoke(new FooHolder(), new Object[]{ null }); 
6

을 시도;

형 널의 인수가 명시 적으로 [] 오브젝트 캐스팅되어야 위한 입력 방법에서 가변 인자 메소드 호출 (개체, 개체 ...)의 호출. varargs를 사용하기 위해 Object로 변환 할 수도 있습니다. 호출

다음과 같이 수정할 수 있습니다.

Object arg = null; 
method.invoke(new FooHolder(), arg); 
3

이미 게시 된 솔루션에 대한 설명.

Method.invoke()은 변수 arity 함수로 선언되어 있으므로 일반적으로 개체 배열을 명시 적으로 만들 필요가 없습니다. 객체 배열 자체로 해석 될 수있는 단일 매개 변수를 전달한 경우에만 method.invoke(obj, null)이 실패합니다.

예를 들어 메서드에 두 개의 매개 변수가있는 경우 method.invoke(obj, null, null)은 완벽하게 작동합니다.

그러나 방법에 단일 Object[] 매개 변수가있는 경우 항상 매개 변수를 랩핑해야합니다.

6

나를 위해,이 작동하지 않습니다

m.invoke (c.newInstance를(), 새로운 객체 [] {널 (null)});

하지만이 작품 :

m.invoke (c.newInstance(), 새로운 객체 [] {});

+2

그러면 인수가없는 메소드가있을 수 있습니다. –

관련 문제