请问一下红框里的代码是什么意思呢,为什么不能像上面那样直接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内容。所以不能识别可变参数,必须用相对应的数组方式。