引用:http://xiaohuafyle.iteye.com/blog/1607258函数
经过反射建立新的类示例,有两种方式:
Class.newInstance()
Constructor.newInstance()
如下对两种调用方式给以比较说明:
Class.newInstance() 只可以调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 能够根据传入的参数,调用任意构造构造函数。
Class.newInstance() 抛出全部由被调用构造函数抛出的异常。
Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的状况下,能够调用私有的构造函数。
Class A(被调用的示例): spa
- public class A {
- private A() {
- System.out.println("A's constructor is called.");
- }
-
- private A(int a, int b) {
- System.out.println("a:" + a + " b:" + b);
- }
- }
Class B(调用者): blog
- public class B {
- public static void main(String[] args) {
- B b=new B();
- out.println("经过Class.NewInstance()调用私有构造函数:");
- b.newInstanceByClassNewInstance();
- out.println("经过Constructor.newInstance()调用私有构造函数:");
- b.newInstanceByConstructorNewInstance();
- }
-
- private void newInstanceByClassNewInstance(){
- try {
- A a=(A)Class.forName("reflect.A").newInstance();
- } catch (Exception e) {
- out.println("经过Class.NewInstance()调用私有构造函数【失败】");
- }
- }
-
-
- private void newInstanceByConstructorNewInstance(){
- try {
- Class c=Class.forName("A");
-
- Constructor c0=c.getDeclaredConstructor();
- c0.setAccessible(true);
- A a0=(A)c0.newInstance();
-
- Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});
- c1.setAccessible(true);
- A a1=(A)c1.newInstance(new Object[]{5,6});
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
输入结果以下:
经过Class.NewInstance()调用私有构造函数:
经过Class.NewInstance()调用私有构造函数【失败】
经过Constructor.newInstance()调用私有构造函数:
A's constructor is called.
a:5 b:6
说明方法newInstanceByClassNewInstance调用失败,而方法newInstanceByConstructorNewInstance则调用成功。
若是被调用的类的构造函数为默认的构造函数,采用Class.newInstance()则是比较好的选择,
一句代码就OK;若是是老百姓调用被调用的类带参构造函数、私有构造函数,
就须要采用Constractor.newInstance(),两种状况视使用状况而定。
不过Java Totorial中推荐采用Constractor.newInstance()。 get