2017-12-20 21 views
1

これを完全に簡単に再現するためにgroovy-reflection-troubleshooting repoを作成しました。GroovyはReflectionsが嫌いですnull argsを取るコンストラクタ


基本的には、この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) 

私は思ったんだけど推測なぜ私は0123を渡すことができないをconstructor.newInstance(null)に入れて、私が本当に新しいインスタンスに値nullを渡したいのであれば、私はconstructor.newInstanceを渡すことができますか?

答えて

2

newInstaceは可変引数をとります。 nullで呼び出すと、nullの配列(つまり引数なし)と解釈されます。クラスにはこのようなデフォルトのコンストラクタがないため、呼び出しは失敗します。これを解決する

一つの方法は、明示的にコンストラクタを持っている一つの引数を表す、単一nullの要素を持つ配列を渡すことです:

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

おかげ@Mureinik(1)のが、あなたの提案はまだ動作しません。 (同じ例外)。レポを複製して自分でチェックしてみてください...どんなアイデアですか?再度、感謝します! – smeeb

+0

@smeebええ、私の悪い。古いJavaの習慣私の推測 - 私の推論は健全だったが、私の解決策は間違いではなかった。動作するソリューションについては、私の編集した答えをご覧ください。 – Mureinik

関連する問題