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

    内省介绍

    内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。

    例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。

    Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。

    内省和反射区别:

    反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。
    内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。

    image-20210420204247097

    代码

    javabean

    public class User {
    
        private String name;
    
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    

    测试方法:

        public static void main(String[] args) throws IntrospectionException {
            //获取指定字节码的属性信息(获取User类,不获取Object类)
            BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
            System.out.println("=================属性描述==================");
            //获取所有属性描述器
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor pd : propertyDescriptors) {
                //获取属性名称
                System.out.println(pd.getName());
                //get方法,pd.getReadMethod()返回值是Method
                //所以获取Method后就可以使用反射做相关事情
                System.out.println(pd.getReadMethod());
                //set方法
                System.out.println(pd.getWriteMethod());
            }
            System.out.println("=================类描述==================");
            BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
            System.out.println(beanDescriptor);
            System.out.println("=================方法描述==================");
            MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
            for (MethodDescriptor md : methodDescriptors) {
                System.out.println(md);
            }
        }
    

    image-20210420210247922

    内省使用场景:根据属性名称得出该属性的读写方法。内省一般写业务代码的时候是用不到的,大部分是在写一些框架或者工具的时候会用到。

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14682889.html
Copyright © 2011-2022 走看看