您可以使用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
|
|