java - Groovy 不喜欢 Reflections 构造函数采用 null 参数

标签 java groovy reflection null

我创建了一个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 code> 如果我真的希望向新实例传递值 null?!

最佳答案

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

解决此问题的一种方法是显式传递一个带有单个 null 元素的数组,该元素表示构造函数具有的一个参数:

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

关于java - Groovy 不喜欢 Reflections 构造函数采用 null 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899263/

相关文章:

date - grails 在 gsp View 中更改日期格式

java - Groovy - 编写和格式化 excel 2010

go - 接口(interface)指针的奇怪行为

c# - 克隆不同对象属性的最佳方法

c# - c#中的基本接口(interface)

java - 设置 OpenCMIS InMemory 存储库

java - 需要有关字符串搜索设计的建议

java - 仅斐波那契 For 循环

java - 线程同步和 volatile 关键字

groovy - SDN 4 Gradle 设置