构造方法的获取
1. 四个方法:getConstructors()获取所有的构造方法;
getConstructor(parameters)获取匹配参数的构造方法;
getDeclaredConstructors()仅获取类中所有真正的构造方法,不包括从父类继承的构造方法;
getDeclaredConstructor(parameters)仅获取类中匹配参数的所有真正的构造方法,不包括从父类继承的构造方法。
2. 对于构造方法中参数为可变参数的情况,当调用getDeclaredConstructor(parameters)时,parameters应该是数组类型的Class对象,
例如 String[].class
3. 关于嵌套类的构造方法的调用
需要区分静态和非静态嵌套类两种情况,静态情况下,和一般的调用方法一样,非静态情况下则比较特殊。
(1)静态嵌套类
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 }
时间: 2024-10-27 13:53:18