java.beans 包包含了开发 bean 相关的类,各种操作自定义 bean 的类,比如持久化类实例,内省实现。
持久化
举一个使用 java.beans
包中类的例子。
目的: 将 User
类的实例,存储到 xml
文件中,然后从 xml
文件中读取该实例输出。
用到的类 java.beans.XMLDecoder
,java.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