反射 構造函數 參數

引用:http://xiaohuafyle.iteye.com/blog/1607258函數

經過反射建立新的類示例,有兩種方式: 
Class.newInstance() 
Constructor.newInstance() 

如下對兩種調用方式給以比較說明: 
Class.newInstance() 只可以調用無參的構造函數,即默認的構造函數; 
Constructor.newInstance() 能夠根據傳入的參數,調用任意構造構造函數。 

Class.newInstance() 拋出全部由被調用構造函數拋出的異常。 

Class.newInstance() 要求被調用的構造函數是可見的,也即必須是public類型的; 
Constructor.newInstance() 在特定的狀況下,能夠調用私有的構造函數。 

Class A(被調用的示例): spa

Java代碼   收藏代碼
  1. public class A {  
  2.     private A() {  
  3.         System.out.println("A's constructor is called.");  
  4.     }  
  5.   
  6.     private A(int a, int b) {  
  7.         System.out.println("a:" + a + " b:" + b);  
  8.     }  
  9. }  


Class B(調用者): blog

Java代碼   收藏代碼
  1. public class B {   
  2.     public static void main(String[] args) {   
  3.         B b=new B();   
  4.         out.println("經過Class.NewInstance()調用私有構造函數:");   
  5.         b.newInstanceByClassNewInstance();   
  6.         out.println("經過Constructor.newInstance()調用私有構造函數:");   
  7.         b.newInstanceByConstructorNewInstance();   
  8.     }   
  9.     /*經過Class.NewInstance()建立新的類示例*/   
  10.     private void newInstanceByClassNewInstance(){   
  11.         try {/*當前包名爲reflect,必須使用全路徑*/   
  12.             A a=(A)Class.forName("reflect.A").newInstance();   
  13.         } catch (Exception e) {   
  14.             out.println("經過Class.NewInstance()調用私有構造函數【失敗】");   
  15.         }  
  16.     }  
  17.       
  18.     /*經過Constructor.newInstance()建立新的類示例*/   
  19.     private void newInstanceByConstructorNewInstance(){   
  20.         try {/*能夠使用相對路徑,同一個包中能夠不用帶包路徑*/   
  21.             Class c=Class.forName("A");   
  22.             /*如下調用無參的、私有構造函數*/   
  23.             Constructor c0=c.getDeclaredConstructor();   
  24.             c0.setAccessible(true);   
  25.             A a0=(A)c0.newInstance();   
  26.             /*如下調用帶參的、私有構造函數*/   
  27.             Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});   
  28.             c1.setAccessible(true);   
  29.             A a1=(A)c1.newInstance(new Object[]{5,6});   
  30.         } catch (Exception e) {   
  31.             e.printStackTrace();   
  32.         }   
  33.     }   
  34. }  


輸入結果以下: 
經過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

相關文章
相關標籤/搜索