• 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

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

  • 相关阅读:
    在mvc中,使用a链接,怎么转到别的html中
    mvc中怎么读取值传到后台中方法之一(表单传值法)
    mvc中怎么带参传递
    sqlserver去掉字符串结尾的全角空格并用半角替换
    Ajax学习笔记
    Ajax级联实例
    [转]js导航栏处于选中状态
    asp.net GridView的使用
    keycode大全
    IsPostBack的使用
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14682889.html
Copyright © 2020-2023  润新知