zoukankan      html  css  js  c++  java
  • java内省机制Introspector

    访问JavaBean属性的两种方式

    1)直接调用bean的setXXX或getXXX方法;

    2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式:

      a)通过PropertyDescriptor类操作Bean的属性;

      b)通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。

    public class Person {
        private String name; // 字段
        private String password;// 字段
        private Integer age;// 字段
        // 对字段添加了get或者set方法了,才叫做属性
        public String getXxx() {
            return "aa";
        }
        setter/getter
    }

    以下通过内省机制来操作Person对象。

    获得类所有的属性

    @Test
        public void test1() throws Exception {
    
            BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); //得到属性描述符
    
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                System.out.println(propertyDescriptor.getName());
            }
        }

    执行结果:age  class  money  name  password  xxx

    包括了从父类中继承过来的属性class

    获得本类中的所有属性

    @Test
        public void test2() throws Exception {
            // 剔除Object继承过来的属性
            BeanInfo beanInfo = Introspector.getBeanInfo(Person.class, Object.class);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
    
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                System.out.println(propertyDescriptor.getName());
            }
        }

    操纵bean的指定属性

    @Test
        public void test3() throws Exception {
            Person person = new Person();
    
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor("age", Person.class);
    
            // 得到属性的写方法,为属性赋值
            Method setAgeMethod = propertyDescriptor.getWriteMethod(); // setAge
            setAgeMethod.invoke(person, 34);
    
            // 获取属性的值
            System.out.println(person.getAge());
            Method getAgeMethod = propertyDescriptor.getReadMethod();
            System.out.println(getAgeMethod.invoke(person, null));
        }

    获取当前操作的属性的类型

    @Test
        public void test4() throws Exception {
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor("money",Person.class);
            
            Class<?> propertyType = propertyDescriptor.getPropertyType();
            System.out.println(propertyType);
        }
  • 相关阅读:
    【002】有符号数据传递给无符号变量
    C++第二课 数据类型和常变量
    【001】冒泡排序
    iOS中为网站添加图标到主屏幕以及增加启动画面
    _stdcall,_cdecl区别
    解决表格里面使用text-overflow后依旧不能隐藏超出的文本
    windows7 64位下运行 regsvr32 注册ocx或者dll的方法
    在sqlite中使用索引
    ASP中 Request.Form中文乱码的解决方法
    html——标签基础
  • 原文地址:https://www.cnblogs.com/luogankun/p/3991451.html
Copyright © 2011-2022 走看看