反射是一个Java中一个很好的机制
其中创建对象蛮关键的,创建对象有两种方式:Class.newInstance()和Constructor.newInstance() 以下对两种调用方式给以比较说明:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数且修饰符不能用private
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数且修饰符不能用private修饰
给一个Teacher类
public class Teacher {
public int age;
public String name;
//无参构造器
public Teacher(){
System.out.println("你好,这里是无参的构造器");
}
//有参构造器
public Teacher(int a){
System.out.println("你好,这里是有参的构造器,两个参数的和为");
System.out.println("老师的年龄为:"+a);
this.age = a;
}
@Override
public String toString() {
return "Teacher{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
下面是测试类:
public class Test_01 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获取字节码信息
Class c = Teacher.class;
//todo 创建一个teacher对象,用Class.newInstance() 默认就是无参构造器,如果传入参数将会报错,可以动手试一下
Object o1 = c.newInstance();
System.out.println(o1);
System.out.println("-----------------------");
//todo 创建一个teacher对象,用Constructor().newInstance() 可以是任意的,既可以传入参数,也可以不传入参数
//todo 先整个有参数的
Object o2 = c.getConstructor(int.class).newInstance(10);
System.out.println(o2);
System.out.println("-----------------------");
//todo 再整个无参数的
Object o3 = c.getConstructor().newInstance();
System.out.println(o3);
}
}
运行结果如下:
如果被调用的类的构造函数为默认的构造函数,采用Class.newInstance()则是比较好的选择,一句代码就OK;如果是调用被调用的类带参构造函数,就需要采用Constructor.newInstance(),两种方法视使用情况而定。