返回顶部

反射(学习整理)----操作类、属性、方法!

   刚学的反射,利用博客写一篇笔记!(附上代码!)

1、下面是我的分析笔记

其他:
    1、用static修饰的归位类所拥有的,没有static修饰的归对象拥有!
    
    2、




反射机制:
    不需要用到new,反射不需要new!

    反射是程序运行的时候动态地加载类的属性和方法
    
    获取类对象类型中的内容,都必须通过classType对象
    步骤:
          1、获取类的对象类型

            语法格式:    
                Class cls=Class.forName("包名.类名");
            举例:
                Class<?> classType=Class.forName("cn.jason.reflections.Constomer");
            说明:
                此处的?代表任意类型对象,相当于Object

          2、通过反射,获取类对象里面的所有属性

            语法格式:
                Field[] fields=classType.getDeclaredFields();

                //循环打印获取到的属性Name
                for (Field field : fields) {
                    System.out.println(field.getName());
                }
          3、通过反射,获取类对象里面的所有方法或指定的方法
            
            1)、获取所有的方法
                //获取类中的所有的方法
                Method[] methods=classType.getMethods();
                for (Method method : methods) {
                    System.err.println(method.getName());
                }

            2)、获取指定方法名称的方法

                //属性的第一个字母截取出来,并且大写化
                String firstLetter=name.substring(0, 1).toUpperCase();
                
                //拼接属性get方法的方法名
                String getMethodName="get"+firstLetter+name.substring(1);
                String setMethodName="set"+firstLetter+name.substring(1);
        
                //现在动态获取get方法
                    Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{});
                
                //现在动态获取set方法   参数列表:(int id)
                    Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
            
        分析说明一下:
            (1)getDeclaredMethod(getMethodName, new Class[]{});
                
                该方法的第一个参数,是需要获取方法对象的方法名,

                该方法的第二个参数,是执行方法的参数类别的, 的参数类型的数组

            (2)getDeclaredMethod(setMethodName, new Class[]{field.getType()});

                 其中的field.getType()是获取类字段的类型
        
            (3反射程序中,关于参数类型的对象数组:用Class[]{}存放
                       具体的数据类型:用int.class、String.class等形式
                       提示:Integer.TYPE 效果等价于 int.class
        
        
        4、通过反射,获取类对象(要执行反射的获取的方法,前提就是要获取类的对象,但不是new出来的,是反射获取得到的!//通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取)
                    Object obj=classType.getConstructor(new Class[]{int.class,String.class})
                                        .newInstance(new Object[]{18,"天使彦"});    

            分析一下:
                1)、这个方法是使用反射机制获取类的对象的,类似new出来的实例!

                2)、其中:getConstructor(new Class[]{int.class,String.class})
                       
                       说明:参数列表放的是:构造方法的参数列表的数据类型、或数据类型的集合

        
        5、执行方法---是否有返回值  根据方法的返回类型来确定    
            
            语法格式:    
                方法对象.invoke(类对象,实参数据集合)
                
            举例:
                setmethod.invoke(obj,(new Object[]{18,"天使彦"});
            
                Object value=getmethod.invoke(obj,(new Object[]{});
        
            说明一下:
                实参数据集合:放在Object[]中,毕竟是参数据是可以为各种类型的!

  2、下面是测试源码

实体类: 

 1 package cn.jason.reflections;
 2 
 3 /**
 4  * 反射测试:
 5  *         用户类
 6  *    Created by Jason  2016-7-16  上午11:22:03
 7  */
 8 public class Constomer {
 9 
10     /**
11      * 成员变量
12      */
13     private int id;            //用户id
14     private String name;    //用户姓名
15     
16     /**
17      *构造器:
18      */
19     public Constomer(){
20         
21     }
22     public Constomer(int id,String name){
23         this.id=id;
24         this.name=name;
25     }
26     
27     /**
28      * getter和setter方法
29      */
30     public int getId() {
31         return id;
32     }
33     public void setId(int id) {
34         this.id = id;
35     }
36     public String getName() {
37         return name;
38     }
39     public void setName(String name) {
40         this.name = name;
41     }
42     
43     
44 }

  反射测试类:

 1 package cn.jason.reflections;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 
 7 /**
 8  *    Created by Jason  2016-7-16  上午11:31:04
 9  */
10 public class TestReflect {
11     
12     public static void main(String[] args) {
13         TestReflect.getproperty();
14     }
15 
16     /**
17      * 获取用户类型里面的属性以及getter好getter方法
18      */
19     public static void getproperty(){
20          try {
21             //第一步:获取对象类型
22             Class<?> classType=Class.forName("cn.jason.reflections.Constomer");
23             
24             //通过反射,获取用户类里面的所有属性
25             Field[] fields=classType.getDeclaredFields();
26             
27             //循环打印获取到的属性Name
28             int i=0;
29             for (Field field : fields) {
30                 String name=field.getName();
31                 //System.out.println("类对象的字段名称:"+name);
32                 
33                 //属性的第一个字母截取出来,并且大写化
34                 String firstLetter=name.substring(0, 1).toUpperCase();
35                 
36                 //拼接属性get方法的方法名
37                 String getMethodName="get"+firstLetter+name.substring(1);
38                 String setMethodName="set"+firstLetter+name.substring(1);
39                 //System.err.println("拼接后的方法名称:"+getMethodName+","+setMethodName);
40                 
41                 //现在动态获取get方法
42                     Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{});
43                 
44                 //现在动态获取set方法   参数列表:(int id)
45                     Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
46                     
47                 //通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取)
48                     Object obj=classType.getConstructor(
49                                             new Class[]{int.class,String.class}).newInstance(
50                                             new Object[]{18,"天使彦"});
51                 //执行get方法获取数据        空参数
52                     Object value=getmethod.invoke(obj, new Object[]{});
53             
54                     System.out.println("[1]执行了方法"+getMethodName+"()之后,返回结果是:"+value);
55                     
56                 //执行set方法:2次遍历的参数类型是不一样的!所以不能写死了!否则会报参数类型错误!
57                     Object[] params=new Object[1];
58                     if(i==0){
59                         params[0]=22;
60                     }else{
61                         params[0]="Jason";
62                     }
63                     setmethod.invoke(obj, params);
64                     Object value2=getmethod.invoke(obj, new Object[]{});                    
65                     System.out.println("[2]执行了方法"+getMethodName+"()之后,返回结果是:"+value2);
66                     
67                     //计数器+1
68                     i++;
69             }
70             
71             //获取类中的所有的方法
72             Method[] methods=classType.getMethods();
73             for (Method method : methods) {
74                 //System.err.println(method.getName());
75             }
76             
77         } catch (Exception e) {
78             e.printStackTrace();
79         }
80     }
81 }

  测试运行结果: 

[1]执行了方法getId()之后,返回结果是:18
[2]执行了方法getId()之后,返回结果是:22
[1]执行了方法getName()之后,返回结果是:天使彦
[2]执行了方法getName()之后,返回结果是:Jason
下面是获取反射对象内部全部的方法
getName()
getId()
setName()
setId()
wait()
wait()
wait()
hashCode()
getClass()
equals()
toString()
notify()
notifyAll()

 

posted @ 2016-07-16 13:41  小风微灵-彦  阅读(2006)  评论(0编辑  收藏  举报
加载中……