2012-06-25 4 views
2

해당 매개 변수가 Object ... objects 인 경우 생성자를 반사 식으로 가져올 수 있습니다.자바 | 생성자를 반사적으로 가져 오기

내 생성자 :

public MyClass (Object ... objects) 
    { 
    if (! (objects == null)) 
    { 
     if (objects.length > 0 && objects [ 0 ] instanceof Long) 
     { 
     setLatency ((Long) objects [ 0 ]) ; 
     } 
    } 
    } 

내가 지금 얼마나 :

Class<?> clazz = Class.forName ("MyClass") ; 

Constructor<?> clazzConstructor = clazz.getConstructor (Object [ ].class) ; 

내가하려고 무엇 :

Long latency = 1000L ; 

MyClass myInstance = (MyClass) clazzConstructor.newInstance (latency) ; 

을 내가 java.lang.IllegalArgumentException가 발생합니다 : 인수 형식 불일치

대기 시간 == null이면 모든 것이 작동합니다.

+0

어떻게'newInstance와 (새로운 객체 [] {지연})'에 대해? –

+0

시도했지만 여전히 작동하지 않습니다. –

+1

@Banthar 'newInstance()'자체가 varargs라는 사실에도 불구하고 작동합니다. – biziclop

답변

8

귀하의 생성자가 객체 배열을 기대하고 있지만 하나의 Long을 전달 중입니다.

자체가 Object ...을 기대하고있다 newInstance()로 조심해야하지만, 작동 객체 배열로 latency 포장, 당신은 Object[] 그러나에게 아무것도 통과하지 않는 경우, 그것은 인수 목록으로 해석됩니다. 그래서 당신은 이런 식으로 뭔가를해야 할 것이다 :

MyClass myInstance = (MyClass) clazzConstructor.newInstance ((Object)new Object[] { latency }) ; 

또는

MyClass myInstance = (MyClass) clazzConstructor.newInstance (new Object[] { new Object[] { latency } }) ; 

첫 번째 "바보"다른으로 객체 배열을 포장에 컴파일러

, 두 번째는 명시 적으로 대신 않습니다.

(널 (null)에 상관없이 매개 변수의 선언 된 유형이 무엇인지, null이 없기 때문에 null를 건네 만했다.)

+0

긴 오브젝트가 아닐까요? – jn1kk

+4

예, 배열이 아닙니다. – duffymo

+0

시도했지만 여전히 작동하지 않습니다. –

7

인수와 같은 개체의

MyClass myInstance = (MyClass) clazzConstructor 
     .newInstance(new Object[] { new Object[] { latency } }); 

newInstance(Object ... initargs) 필요 배열이이 방법을 사용해보십시오. 생성자에서 주먹 인수를 구입하면 객체 배열 Object... o의 배열이기 때문에 Object 배열로 다시 포장해야합니다.

나는이 코드와 그것을 시험은 잘 작동하는 것 같다

class MyClass { 
    private Long latency; 

    public void setLatency(Long latency) { 
     this.latency = latency; 
    } 
    public Long getLatency() { 
     return latency; 
    } 

    public MyClass(Object... objects) { 
     if (!(objects == null)) { 
      if (objects.length > 0 && objects[0] instanceof Long) { 
       setLatency((Long) objects[0]); 
      } 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Class<?> clazz = MyClass.class; 

     Constructor<?> clazzConstructor = clazz.getConstructor(Object[].class); 
     System.out.println(clazzConstructor); 

     Long latency = 1000L ; 
     MyClass myInstance = (MyClass) clazzConstructor 
       .newInstance(new Object[] { new Object[] { latency } }); 
     System.out.println(myInstance); 
     System.out.println(myInstance.getLatency()); 
    } 
} 
+0

매우 감사합니다. –