構造方法的獲取java
1. 四個方法:getConstructors()獲取全部的構造方法;數組
getConstructor(parameters)獲取匹配參數的構造方法;this
getDeclaredConstructors()僅獲取類中全部真正的構造方法,不包括從父類繼承的構造方法;spa
getDeclaredConstructor(parameters)僅獲取類中匹配參數的全部真正的構造方法,不包括從父類繼承的構造方法。code
2. 對於構造方法中參數爲可變參數的狀況,當調用getDeclaredConstructor(parameters)時,parameters應該是數組類型的Class對象,對象
例如 String[].classblog
3. 關於嵌套類的構造方法的調用繼承
須要區分靜態和非靜態嵌套類兩種狀況,靜態狀況下,和通常的調用方法同樣,非靜態狀況下則比較特殊。get
(1)靜態嵌套類io
1 package jichu; 2 3 import java.lang.reflect.Constructor; 4 5 /** 6 *@author 做者 Yu chenchen 7 *@version 建立時間:2017年4月28日 上午11:05:33 8 *類說明: 9 */ 10 public class TestReflection { 11 12 public TestReflection(){ 13 14 } 15 public TestReflection(String str) { 16 // TODO Auto-generated constructor stub 17 } 18 19 //靜態嵌套類 20 static class NestedClass{ 21 public NestedClass(int i) { 22 // TODO Auto-generated constructor stub 23 } 24 } 25 26 public void test() throws Exception{ 27 Constructor<TestReflection> constructor = TestReflection.class.getDeclaredConstructor(String.class); 28 constructor.newInstance("ycc"); 29 //獲取靜態嵌套類的構造方法 30 Constructor<NestedClass> constructor2 = NestedClass.class.getConstructor(int.class); 31 constructor2.newInstance(11); 32 33 } 34 public static void main(String[] args) { 35 try { 36 new TestReflection().test(); 37 } catch (Exception e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 } 41 42 } 43 44 }
(2)非靜態嵌套類
對於非靜態嵌套類來講,它的對象實例中有一個隱含的指向外部類對象的引用,靠這個引用能夠訪問外部類對象的私有域和方法,所以在獲取非靜態嵌套類的構造方法時,類型參數列表的第一個參數必須爲外部類的Class對象。在獲取到構造方法以後,調用newInstance()方法時,第一個參數應該爲外部類對象的引用this,與調用getDeclaredConstructor()方法的第一個參數對應。
1 package jichu; 2 3 import java.lang.reflect.Constructor; 4 5 /** 6 *@author 做者 Yu chenchen 7 *@version 建立時間:2017年4月28日 上午11:05:33 8 *類說明: 9 */ 10 public class TestReflection { 11 12 public TestReflection(){ 13 14 } 15 public TestReflection(String str) { 16 // TODO Auto-generated constructor stub 17 } 18 19 //非靜態嵌套類 20 class NestedClass{ 21 public NestedClass(int i) { 22 // TODO Auto-generated constructor stub 23 } 24 } 25 26 public void test() throws Exception{ 27 Constructor<TestReflection> constructor = TestReflection.class.getDeclaredConstructor(String.class); 28 constructor.newInstance("ycc"); 29 //獲取非靜態嵌套類的構造方法 30 Constructor<NestedClass> constructor2 = NestedClass.class.getConstructor(TestReflection.class,int.class); 31 constructor2.newInstance(this,11); 32 //或者 33 constructor2.newInstance(TestReflection.this,11); 34 35 } 36 public static void main(String[] args) { 37 try { 38 new TestReflection().test(); 39 } catch (Exception e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 44 } 45 46 }