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);
        }
  • 相关阅读:
    Tomcat多域名及二级域名的配置
    Java 分割字符串
    Java 判断字符串是否为数字(浮点类型也包括)
    MySQL 判断某字段是否包含中文或字母字符的方法
    Java List排序,分组等操作
    Java 遍历List或Map集合的4种方式
    spring quartz注解任务执行两次解决方案
    java 获取当前时间精确到毫秒 格式化
    Java 方法返回多种类型
    Tomcat 设置直接通过域名访问项目(不需要接 /项目名)
  • 原文地址:https://www.cnblogs.com/luogankun/p/3991451.html
Copyright © 2011-2022 走看看