您可以使用Class的newInstance()方法来实例化一个对象,例如:
Class c = Class.forName(args[0]); Object obj= c.newInstance();
如果加载的类别定义有无参数的建构函式,则可以使用这种方式来建构一个不指定初始参数的对象,如果您要在动态加载及生成对象时指定参数,则要先指定参数类别、取得Constructor对象、使用Constructor的newInstance()并指定参数值。
以一个例子来说明,首先我们定义一个Student类:
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;
}
}
然后以动态加载的方式来动态生成对象:
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