java Introspector(内省) 的介绍

1. 什么是内省

一言以蔽之: Introspector 是操作 javaBean 的 API,用来访问某个属性的 getter/setter 方法。

对于一个标准的 javaBean 来说,它包括属性、get 方法和 set 方法,这是一个约定俗成的规范。为此 sun 提供了 Introspector 工具包,来使开发者更好或者更灵活的操作 javaBean。

2. 都有哪些 API 可以用

image.png

核心类是 Introspector, 它提供了的 getBeanInfo 系类方法,可以拿到一个 JavaBean 的所有信息。

通过 BeanInfogetPropertyDescriptors 方法和 getMethodDescriptors 方法可以拿到 javaBean 的字段信息列表和 getter 和 setter 方法信息列表。

PropertyDescriptors 可以根据字段直接获得该字段的 getter 和 setter 方法。

MethodDescriptors 可以获得方法的元信息,比如方法名,参数个数,参数字段类型等。

3. 怎么用

创建一个标准的 javabean

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

测试1

    @Test
    public void test1() throws Exception {
        // 获取整个Bean的信息
        // BeanInfo beanInfo= Introspector.getBeanInfo(user.getClass());
        // 在Object类时候停止检索,可以选择在任意一个父类停止
        BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);

        System.out.println("所有属性描述:");
        // 获取所有的属性描述
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : pds) {
            System.out.println(propertyDescriptor.getName());
        }
        System.out.println("所有方法描述:");
        for (MethodDescriptor methodDescriptor : beanInfo.getMethodDescriptors()) {
            System.out.println(methodDescriptor.getName());
            // Method method = methodDescriptor.getMethod();
        }
    }

输出:

所有属性描述:
age
name
所有方法描述:
getName
setAge
setName
getAge

测试2,可以直接构造 PropertyDescriptors


    @Test
    public void test2 () throws Exception {
        User user = new User("jack", 21);

        String propertyName = "name";
        PropertyDescriptor namePd = new PropertyDescriptor(propertyName, User.class);

        System.out.println("名字:" + namePd.getReadMethod().invoke(user));
        namePd.getWriteMethod().invoke(user, "tom");
        System.out.println("名字:" + namePd.getReadMethod().invoke(user));

        System.out.println("========================================");

        String agePropertyName = "age";
        PropertyDescriptor agePd = new PropertyDescriptor(agePropertyName, User.class);

        System.out.println("年龄:" + agePd.getReadMethod().invoke(user));
        agePd.getWriteMethod().invoke(user, 22);
        System.out.println("年龄:" + agePd.getReadMethod().invoke(user));

    }

结果:

名字:jack
名字:tom
========================================
年龄:21
年龄:22
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • 那位飞升者神帝,东伯雪鹰首先排除了,对方颇为低调一心修行,这等修行者东伯雪鹰还是很欣赏的,无仇无怨他是不可能对这等...
    im喵小姐阅读 387评论 0 0
  • 每个想逆袭的屌丝可能都会幻想有一天能遇到自己生命中的贵人,助自己一臂之力,成功逆袭高富帅。可并不是每个人都能遇到贵...
    龙小虎阅读 1,710评论 0 1
  • 一. 闭包的运用 我们来看看闭包的用途。事实上,通过使用闭包,我们可以做很多事情。比如模拟面向对象的代码风格;更优...
    qhaobaba阅读 631评论 0 0
  • 风向网 NO.1-----快速防晒喷雾 SPF15 荷兰人都在用的品牌 欧洲居家美容品牌 Rituals,一个走在...
    d0f35e9149b2阅读 408评论 0 1