Java编程--反射(Ⅲ 调用构造方法)
一. 利用反射调用构造方法:
【范例】观察当前程序的问题。
public class Book {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "Title : " + this.title + ", price : " + this.price;
}
}
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("com.it.test2.Book");
Object obj = cls.newInstance(); // 相当于使用new调用无参构造实例化
System.out.println(obj);
}
}
运行结果:
以上出现的错误指的就是当前Book类没有无参构造方法,所以程序无法进行对象的实例化。在这种情况下,只能明确调用有参构造方法。
二. Class类里面提供了方法可以取得构造:
public Constructor<?>[] getConstructors() throws SecurityException 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 |
返回: 表示此类公共构造方法的 Constructor 对象数组 |
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 |
参数: parameterTypes - 参数数组 |
返回: 与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象 |
以上两个方法返回的都是”java.lang.reflect.Constructor”类的对象。在这个类中提供有一个明确传递有参构造内容的实例化对象方法。
public T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。个别参数会自动解包,以匹配基本形参,必要时,基本参数和引用参数都要进行方法调用转换。 |
【范例】调用类中的有参构造。
import java.lang.reflect.Constructor;
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("com.it.test2.Book");
Constructor<?> con = cls.getConstructor(String.class,double.class);
Object obj = con.newInstance("Java开发",68.80);
System.out.println(obj);
}
}
运行结果: