可变参数的使用,求过位路过的指教一下

请问一下红框里的代码是什么意思呢,为什么不能像上面那样直接example2=(Example01) constructor.newInstance(“100”,“200”,“300”)图片说明图片说明图片说明直接example2=(Example01) constructor.newInstance(“100”,“200”,“300”)的话不断打印“在创建对象时抛出异常,下面执行setAccessable"

这个问题要分几步回答:

1,可变参数,java编译器是将可变参数当作数组处理的

    method(String... args) { }

等价于

    method(String[] args){ }

2,Constuctor.newInstance()使用的就是可变参数

    public T newInstance(Object ... initargs)

等同于

    public T newInstance(Object[] initargs)

3,你要定位到的构造函数相当于

    Example01(String[] strings)

而你的代码

    constructor.newInstance(“100”,“200”,“300”)

等同于

    constructor.newInstance(new Object[]{“100”,“200”,“300”})

代表的是找有三个string作为参数的构造函数,因此只能用

    constructor.newInstance(new Object[]{new String[]{“100”,“200”,“300”}})

你理想中希望java能将三个String当作可变参数去匹配,但是除了直接通过方法调用,外部是不能识别可变参数的

Constuctor.newInstance()使用的就是可变参数

public T newInstance(Object ... initargs)

等同于

public T newInstance(Object[] initargs)什么意思

换一个角度讲,可变参数最后编译后的样子是什么样的?一段包含可变参数函数的代码编译成class,最后通过jd-gui反编译.class文件:
源代码:

     public static void main(String[] args) {
        method("1", "2", "3");
    }

    static void method(String... params) {

    }

通过编译后.class文件反编译:

 public static void main(String[] args)
  {
    method(new String[] { "1", "2", "3" });
  }

  static void method(String[] params)
  {
  }

很明显,经过编译器编译后,可变参数回归到了数组模式。
java.lang.reflect.Constructor是java的反射机制的一部分,即读取的是编译后的.class内容。所以不能识别可变参数,必须用相对应的数组方式。