2017-12-20 31 views
1

전적으로 쉽게 이것을 재현하기 위해 groovy-reflection-troubleshooting repo을 생성했습니다.Groovy가 Reflections를 좋아하지 않습니다. 생성자가 null 인수를 취합니다

Class<?> clazz = Class.forName('troubleshooting.DangWidget') 
Constructor<?> constructor = clazz.getConstructor(Configuration) 
Object testClassInstance = constructor.newInstance(new Configuration()) 
// Object testClassInstance = constructor.newInstance(null) 

을하지만 이것은 IllegalArgumentException 발생 :


기본적으로이 그루비 코드는 잘 실행

Class<?> clazz = Class.forName('troubleshooting.DangWidget') 
Constructor<?> constructor = clazz.getConstructor(Configuration) 
// Object testClassInstance = constructor.newInstance(new Configuration()) 
Object testClassInstance = constructor.newInstance(null) 

스택 추적 :

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 

내가 궁금하네요 생각을 내가 왜 0123을 통과 할 수 없는지을 constructor.newInstance(null)에 입력하고 값을 전달하려는 경우 constructor.newInstance을 전달하면됩니다.

답변

2

newInstace은 varargs 인수를 취합니다. null으로 전화하면 null 배열로 해석됩니다. 즉, 인수가 없으며 클래스에 기본 생성자가 없으므로 호출이 실패합니다. 이 문제를 해결하기 위해

한 가지 방법은 명시 적으로 생성자가 가지고있는 하나 개의 인수 나타내는 단일 null 요소와 배열을 전달하는 것입니다

Object testClassInstance = constructor.newInstance([null] as Configuration[]) 
+0

감사 @Mureinik (+1) 그러나 당신의 제안은 여전히 ​​작동하지 않습니다 (같은 예외). Repo를 복제하여 직접 확인하십시오. 아이디어가 있습니까? 다시 한 번 감사드립니다! – smeeb

+0

@smeeb 예, 내 잘못입니다. 내 생각에 오래된 Java 습관 - 내 추론은 건전했지만 내 솔루션은 분명히 아니 었습니다. 작동하는 솔루션에 대한 내 편집 된 답변을 참조하십시오. – Mureinik