Java反射constructor.newInstance给出“错误数量的参数”

时间:2018-11-09 17:50:19

标签: java reflection constructor

如何在下面修复我的代码?

package mypackage;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class testReflection {
    public class You {
        public You(String s) {
        }

        public void f(String s, int i) {
            System.out.println(i + 100);
        }
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Constructor constructor =
                You.class.getConstructor(testReflection.class, String.class);
        try {
            You y = (You)constructor.newInstance("xzy");//Exception!!!!
            System.out.println("ok");
            y.f("xyz",2);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

异常消息是:

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 mypackage.testReflection.main

2 个答案:

答案 0 :(得分:5)

来自Constructor#newInstance的{​​{3}}:

  

如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参阅Java™语言规范的15.9.3节。

由于You是一个内部类,因此需要其封闭类testReflection的实例来创建You的实例。为此,可以使用以下命令:

You y = (You) constructor.newInstance(new testReflection(), "xzy");

我还建议您按照正确的命名约定将您的类名更改为TestReflection

答案 1 :(得分:2)

提示在此行上(构造函数使用2个参数):

Constructor constructor =
            You.class.getConstructor(testReflection.class, String.class);

您需要将testReflection的实例发送到newInstance()

testReflection outerObject = new testReflection();
You y = (You)constructor.newInstance(outerObject,  "xzy");