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