反射

作者: guan_xy | 来源:发表于2017-10-09 21:12 被阅读0次

    反射

    概念

    1.png

    Class

    概念:类的灵魂

    获取Class字节码对象的三种方式

        //1、通过类.class
        Class clazz=Hero.class;
        
        //2、通过对象.getClass();
        Hero h=new Hero();
        Class class1 = h.getClass();
    
        //3、通过Class.forName()
        Class class2 = Class.forName("类名");
    

    Constructor

    概念:对构造函数进行封装

    //通过无参构造函数,创建一个新的实例对象
    Object obj = clazz.newInstance();//相当于调用new
    
    //通过参数个数和类型类确定调用哪个构造函数
    Constructor constructor = clazz.getConstructor(String.class);
    //调用有参构造函数,并且传递参数值
    Object obj = constructor.newInstance("郭靖");//相当于调用new
    

    Field

    概念:对类中的属性进行封装

        Field[] fields1 = clazz.getFields();//获取public修饰的属性
        Field[] fields2 = clazz.getDeclaredFields();//获取所有申明的属性
    
        Field field = clazz.getField("name");//获取public修饰的name属性    
        Field field2 = clazz.getDeclaredField("name");//获取申明过的name属性
        
        field2.setAccessible(true);//设置为可以访问的
    
        field.getModifiers();//获取修饰符
        field.getType();//获取类型
            
        field2.set(obj, "lisi");//给属性赋值
    

    内省

    概念:类的照妖镜

        Object obj=Hero.class.newInstance();
        PropertyDescriptor pd=new PropertyDescriptor("name", Hero.class);//获取Heror中的name属性描述器
        Method method = pd.getWriteMethod();//获取该属性的set方法
        method.invoke(obj, "lisi");//调用set方法
    
    反射和内省

    内省的两种使用方法

    public class Student {
    
        private String name;//字段
     
        public String getXxx(){//读方法
     
               return "xx";
    
        }
    
        public String setXxx(){//写方法
     
               return "xx";
    
        }
    
        public String getName() {
    
               return name;
    
        }
    
        public void setName(String name) {
    
               this.name = name;
    
        }
    
    }
    

    一、

    @Test
    
        public void test() throws Exception{
    
               Student student = new Student();
    
               //1.通过Introspector来获取bean对象的beaninfo
     
               BeanInfo bif = Introspector.getBeanInfo(Student.class);
    
               //2.通过beaninfo来获得属性描述器(propertyDescriptor)
     
               PropertyDescriptor pds[] = bif.getPropertyDescriptors();
    
               //3.通过属性描述器来获得对应的get/set方法
    
               for(PropertyDescriptor pd:pds){
    
                      //4.获得并输出字段的名字
    
                      System.out.println(pd.getName());
    
                      //5.获得并输出字段的类型
    
                      System.out.println(pd.getPropertyType());
    
                      if(pd.getName().equals("name")){
    
                             //6.获得PropertyDescriptor对象的写方法
    
                             Method md = pd.getWriteMethod();
    
                             //7.执行写方法
    
                             md.invoke(student, "Lou_Wazor");
    
                      }
    
               }
    
               //8.输出所赋值字段的值
    
               System.out.println(student.getName());
    
           }
    

    二、

    @Test
    
        public void test01()throws Exception{
    
               Student st = new Student();
    
               //1.通过构造器来创建PropertyDescriptor对象
    
               PropertyDescriptor pd = new PropertyDescriptor("name", Student.class);
    
               //2.通过该对象来获得写方法
    
               Method method = pd.getWriteMethod();
    
               //3.执行写方法
    
               method.invoke(st, "Lou_Wazor");
    
               //4.输出对象字段的值
    
               System.out.println(st.getName());
    
               //5.通过对象获得读方法
    
               method = pd.getReadMethod();
    
               //6.执行读方法并定义变量接受其返回值并强制塑形
    
               String name = (String) method.invoke(st, null);
    
               //7.输出塑形后的值
    
               System.out.println(name);
    
        }
    

    相关文章

      网友评论

          本文标题:反射

          本文链接:https://www.haomeiwen.com/subject/vbxmyxtx.html