学习Java(79)_利用反射调用构造方法

在上一篇中提到了可以实例化对象的方法 .newInstance(); 但是该方法只能调用无参的构造方法,如果类中有多个构造方法,并且需要调用的是有参的构造方法,这个如何操作?
默认调用无参构造方法。
class Book
{
	private String bookName;
	private double price;
	
	public Book( String bookName, double price )
	{
		this.bookName = bookName;
		this.price = price;
	}
	
	public String toString()
	{
		return "很好看!";
	}
}
class TestConstructor
{
	public static void main( String[] args ) throws Exception
	{
		Class<?> cls = Class.forName( "Book" );
		Object obj = cls.newInstance();
		System.out.println( obj );
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava>java TestConstructor
	Exception in thread "main" java.lang.InstantiationException: Book
			at java.lang.Class.newInstance(Class.java:427)
			at TestConstructor.main(TestConstructor.java:23)
	Caused by: java.lang.NoSuchMethodException: Book.<init>()
			at java.lang.Class.getConstructor0(Class.java:3082)
			at java.lang.Class.newInstance(Class.java:412)
			... 1 more
	============================
	总结:
		只能默认调用无参的构造方法。
*/
以上出现的错误指的就是因为当前Book类里面并没有无参构造方法,所以程序无法进行实例化。在这种情况下,只能够明确的调用有参的构造方法。
在 Class 类里面提供有一个方法可以取得构造:
1、取得全部构造方法: public Constructor<?>[] getConstructors() throws SecurityException
2、取得一个构造方法:public Constructor<T> getConstructor( Class<?> ... parameterTypes )  throws NoSuchMethodException, SecurityException
以上两个方法返回的都是"java.lang.reflect.Constructor”类的对象,在这个类中提供有一个明确传递有参构造实例化对象的方法:
public T newInstance(Object... initargs)              throws InstantiationException,IllegalAccessException, IllegalArgumentException, InvocationTargetException
范例:明确调用类中的有参构造方法
import java.lang.reflect.*;
class Book
{
	private String bookName;
	private double price;
	
	public Book( String bookName, double price )
	{
		this.bookName = bookName;
		this.price = price;
	}
	
	public String toString()
	{
		return "书名:"+bookName+" 价格:"+price;
	}
}
class TestConstructor
{
	public static void main( String[] args ) throws Exception
	{
		Class<?> cls = Class.forName( "Book" );
		Constructor<?> con = cls.getConstructor( String.class, double.class );
		Object obj = con.newInstance( "一本好书", 88.8 );
		System.out.println( obj );
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava>java TestConstructor
	书名:一本好书 价格:88.8
	============================
	总结:
		通过getConstructor()方法,可以获得有参的构造函数
*/
简单Java类的开发之中不管提供多少个构造方法,都最少保留无参构造。


小艾的博客 http://www.aixinyan.me/