大可制作:QQ群:31564239(asp|jsp|php|mysql)

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