ITEEDU

Java Gossip: 生成物件

您可以使用Class的newInstance()方法来实例化一个对象,例如: 

Class c = Class.forName(args[0]);
Object obj= c.newInstance();

如果加载的类别定义有无参数的建构函式,则可以使用这种方式来建构一个不指定初始参数的对象,如果您要在动态加载及生成对象时指定参数,则要先指定参数类别、取得Constructor对象、使用Constructor的newInstance()并指定参数值。

以一个例子来说明,首先我们定义一个Student类:

Student.java
package onlyfun.caterpillar;
public class Student?{
	private String name;
	private int score;
	public Student() {
		name = "N/A";
	}
	public Student(String name, int score) {
		this.name = name;
		this.score = score;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setScore(int score) {
		this.score = score;
	}
	public String getName() {
		return name;
	}
	public int getScore() {
		return score;
	}
	public String toString() {
		return name + " " + score;
	}
}

然后以动态加载的方式来动态生成对象:

NewInstanceDemo.java
package onlyfun.caterpillar;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class NewInstanceDemo {
	public static void main(String[] args) {
		Class c = null;
		try {
			c = Class.forName(args[0]);
			// 指定参数型态
			Class[] params = new Class[2];
			params[0] = String.class;
			params[1] = Integer.TYPE;
			Constructor constructor =
			c.getConstructor(params);
			// 指定参数内容
			Object[] paramObjs = new Object[2];
			paramObjs[0] = "caterpillar";
			paramObjs[1] = new Integer(90);
			// 实例化
			Object obj = constructor.newInstance(paramObjs);
			System.out.println(obj);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
}

执行的例子如下:

java onlyfun.caterpillar.NewInstanceDemo onlyfun.caterpillar.Student
caterpillar 90