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);
        }
  • 相关阅读:
    asp.net中页面传值的几种经典方法
    关于ASp.NEt方面的好书,不得不看啊!!!
    Qt Creator 窗体控件自适应窗口大小布局
    自己动手打造T9510E EMUIB502新功能
    OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
    Qt 中获取本机IP地址
    嵌入式Linux中GPS信息读取与处理
    OpenCV 学习资源整理
    新Outlook邮箱的客户端设置
    Qt 中显示中文
  • 原文地址:https://www.cnblogs.com/luogankun/p/3991451.html
Copyright © 2011-2022 走看看