我创建了一个groovy-reflection-troubleshooting
repo来完全轻松地重现这一点。
基本上这个Groovy代码运行良好:
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)
我想我想知道为什么我无法将null
传递到constructor.newInstance(null)
以及如果我真的希望传递新实例,我可以通过constructor.newInstance
价值null
?!
答案 0 :(得分:2)
newInstace
采用varargs参数。当您使用null
调用它时,它被解释为null
数组 - 即没有参数,并且由于您的类没有这样的默认构造函数,因此调用失败。
解决此问题的一种方法是使用单个null
元素显式传递数组,表示构造函数具有的一个参数:
Object testClassInstance = constructor.newInstance([null] as Configuration[])