java.beans 包概述

2021/02/18

java.beans 包包含了开发 bean 相关的类,各种操作自定义 bean 的类,比如持久化类实例,内省实现。

持久化

举一个使用 java.beans 包中类的例子。

目的: 将 User 类的实例,存储到 xml 文件中,然后从 xml 文件中读取该实例输出。

用到的类 java.beans.XMLDecoderjava.beans.XMLEncoder

User.java

public class User implements Serializable {

    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;
    }
}

Test.java

public class Test {

    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("a.xml")) {
            User user = new User();
            user.setName("abc");
            user.setAge(10);
            XMLEncoder encoder = new XMLEncoder(outputStream);
            encoder.writeObject(user);
            encoder.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (InputStream inputStream = new FileInputStream("a.xml")) {
            XMLDecoder decoder = new XMLDecoder(inputStream);
            User user = (User) decoder.readObject();
            System.out.println(user.getName() + ":" + user.getAge());
            decoder.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

a.xml 中输出的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_212" class="java.beans.XMLDecoder">
    <object class="User">
        <void property="age">
            <int>10</int>
        </void>
        <void property="name">
            <string>abc</string>
        </void>
    </object>
</java>

控制台输出内容:

abc:10

内省-反射的方式操作 get/set 方法

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

通常的操作:通过 Introspector 获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器 PropertyDescriptor, 通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,最后运用反射技术执行方法。

可以通过下边这个例子更好的理解内省。

public class Test {

    public static void main(String[] args) {
        User user = new User();
        user.setName("abc");
        user.setAge(1);
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
            PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();

            for (PropertyDescriptor descriptor : descriptors) {
                if (descriptor.getName().equals("name")) {
                    Method writeMethod = descriptor.getWriteMethod();
                    writeMethod.invoke(user, "ABC");
                    Method readMethod = descriptor.getReadMethod();
                    Object o = readMethod.invoke(user);
                    System.out.println("修改之后的名字是: " + o);
                }
            }
        } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

控制台输出内容:

修改之后的名字是: ABC

参考

https://blog.csdn.net/qq_39735854/article/details/86848218

Post Directory