通过反射创建新类示例的两种方式及比较

通过反射创建新类示例的两种方式及比较

作者BLOG:http://blog.csdn.net/fenglibing

通过反射创建新的类示例,有两种方式:

Class.newInstance()

Constructor.newInstance()

 

以下对两种调用方式给以比较说明:

l             Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;而Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

l             Class.newInstance() 抛出所有由被调用构造函数抛出的异常。

l             Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的; Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。

 

Class A(被调用的示例):

[java]  view plain copy
  1. public class A {  
  2.     private A(){  
  3.         System.out.println("A's constructor is called.");  
  4.     }  
  5.     private A(int a,int b){  
  6.         System.out.println("a:"+a+" b:"+b);  
  7.     }  
  8. }  

Class B(调用者):

[java]  view plain copy
  1. import java.lang.reflect.Constructor;  
  2.   
  3. import static java.lang.System.out;  
  4.   
  5. public class B {  
  6.   
  7.     public static void main(String[] args) {  
  8.   
  9.         B b=new B();  
  10.   
  11.         out.println("通过Class.NewInstance()调用私有构造函数:");  
  12.   
  13.         b.newInstanceByClassNewInstance();  
  14.   
  15.         out.println("通过Constructor.newInstance()调用私有构造函数:");  
  16.   
  17.         b.newInstanceByConstructorNewInstance();  
  18.   
  19.     }  
  20.   
  21.     /*通过Class.NewInstance()创建新的类示例*/  
  22.   
  23.     private void newInstanceByClassNewInstance(){  
  24.   
  25.         try {  
  26.   
  27.             /*当前包名为reflect,必须使用全路径*/  
  28.   
  29.             A a=(A)Class.forName("reflect.A").newInstance();  
  30.   
  31.         } catch (Exception e) {  
  32.   
  33.             out.println("通过Class.NewInstance()调用私有构造函数【失败】");  
  34.   
  35.         }  
  36.   
  37.     }  
  38.   
  39.     /*通过Constructor.newInstance()创建新的类示例*/  
  40.   
  41.     private void newInstanceByConstructorNewInstance(){  
  42.   
  43.         try {  
  44.   
  45.                       /*可以使用相对路径,同一个包中可以不用带包路径*/  
  46.   
  47.             Class c=Class.forName("A");  
  48.   
  49.             /*以下调用无参的、私有构造函数*/  
  50.   
  51.             Constructor c0=c.getDeclaredConstructor();  
  52.   
  53.             c0.setAccessible(true);  
  54.   
  55.             A a0=(A)c0.newInstance();  
  56.   
  57.               
  58.   
  59.             /*以下调用带参的、私有构造函数*/  
  60.   
  61.             Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});  
  62.   
  63.             c1.setAccessible(true);  
  64.   
  65.             A a1=(A)c1.newInstance(new Object[]{5,6});  
  66.   
  67.         } catch (Exception e) {  
  68.   
  69.             e.printStackTrace();  
  70.   
  71.         }         
  72.   
  73.     }  
  74.   
  75. }  

输入结果如下:

通过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()

你可能感兴趣的:(java,反射,Class)