zoukankan      html  css  js  c++  java
  • 反射(学习整理)----操作类、属性、方法!

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

    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()
  • 相关阅读:
    Android第二次作业
    六月十二课下作业
    第十三周课下作业
    第十三周上机练习
    第十二周课下作业
    第十二周上机作业
    十一周课下作业
    第十一周上机作业
    第十周上机练习
    android-7增删改查
  • 原文地址:https://www.cnblogs.com/newwind/p/5676093.html
Copyright © 2011-2022 走看看