
java创建对象有五种方式,这篇文介绍其中两种,Class.newInstance与Constructor.newInstance都是通过反射创建java对象实例的,这两种方式主要不同之处如下:
1.从调用的构造函数参数来说,Class.newInstance只能调用无参构造函数,Constructor.newInstance则无此限制,原因通过Class类的getDeclaredConstructor(Class<?>... parameterTypes)方法就可以知道
2.从调用的构造函数的可视性来说,Class.newInstance只能调用public类型的构造函数(不能调用内部类,会抛出java.lang.ClassNotFoundException异常),Constructor.newInstance在某些情况下可以调用private类型的构造函数
try {
ClassB cls1 = (ClassB)Class.forName("cm.gm.test.ClassB").newInstance();
cls1.print();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Constructor<?> cs = ClassB.class.getDeclaredConstructor();//ClassB.class.getConstructor();//
cs.setAccessible(true);
ClassB cls2 = (ClassB)cs.newInstance();
cls2.print();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ClassB只有一个private类型的构造函数,Class.newInstance无法调用,但后者可以通过调用setAccessible来完成私有构造函数的调用。
3.从对构造函数抛出的异常处理来说,Class.newInstance不做处理直接抛出,Constructor.newInstance则会对构造函数抛出的异常进行处理,统一抛出InvocationTargetException异常,上述异常处理只是针对调用类构造函数内部抛出的异常!!!