Groovy不喜欢Reflection Constructor采用null args

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy不喜欢Reflection Constructor采用null args相关的知识,希望对你有一定的参考价值。

我已经创建了一个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?!

答案

newInstace采取了varargs论点。当你用null调用它时,它被解释为一个null数组 - 即没有参数,并且因为你的类没有这样的默认构造函数,所以调用失败。

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

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

以上是关于Groovy不喜欢Reflection Constructor采用null args的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 (Could not initialize class org.codehaus.groovy.reflection.ReflectionCache) 反应原生问题

Flutter Build APK:失败 - 无法初始化类“org.codehaus.groovy.reflection.ReflectionCache”

Groovy 反射字符串常量方法

gradle版本太低编译失败

从字符串构建动态LINQ查询 - 使用Reflection?

我可以在不转义属性值的情况下创建 Groovy 节点吗?