Groovy不喜欢反射构造函数以无效的贡献



我创建了一个groovy-reflection-troubleshooting回购以完全和轻松地重现。


基本上此凹槽代码运行良好:

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),如果我真正希望通过新实例的值null?!

,我可以通过constructor.newInstance

newInstace采用varargs参数。当您使用null调用它时,它被解释为null数组 - 即没有参数,并且由于您的类没有这样的默认构造函数,因此呼叫失败。

解决此问题的一种方法是明确传递具有单个null元素的数组,代表构造函数的一个参数:

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

相关内容

  • 没有找到相关文章

最新更新