Java反射基础(一)

构造方法的获取

  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 }

 

     

posted @ 2017-04-28 11:50  coollife  阅读(190)  评论(0编辑  收藏  举报