先创建一个 JavaBean:
public class Circle {
private int r;
public void setR(int val) {
r = val;
}
public int getR() {
return r;
}
}
一、内省操作
运行代码:
var c = new Circle();
var pd = new PropertyDescriptor("r", c.getClass());
pd.getWriteMethod().invoke(c, 5);
System.out.println(pd.getReadMethod().invoke(c));// 输出:5
PropertyDescriptor 的 getRead/WriteMethod() 是根据*方法*而不是字段获取 Metohd 的,只要 JavaBean 同时有 Object getXxx() 和 void setXxx(Object obj) 这两个方法,就可以正常输入输出。
举个例子,为 Circle 类添加以下代码:
public void setString(String str) {}
public String getString() {
return "String";
}
运行以下代码:
var str = new PropertyDescriptor("string",c.getClass()).getReadMethod().invoke(c);
System.out.println(str);// 输出:String
这段代码是可以正常运行的(即使 Circle 类中根本就没有 string 这个字段)。
另外,PropertyDescriptor(String, Class) 的第一个参数的第一个字母,是不区分大小写的。
二、持久化
运行代码:
var c = new Circle();
c.setR(5);
var xe = new XMLEncoder(new FileOutputStream("out.xml"));
xe.writeObject(c);
xe.close();
var xd = new XMLDecoder(new FileInputStream("out.xml"));
var o = xd.readObject();
xd.close();
if (o instanceof Circle) {
System.out.println(((Circle) o).getR());// 输出:5
}
注意:JavaBean 可以不实现 Serializable,但必须包含一个不带参数的构造器。否则 XMLEncoder / XMLDecoder 无法正常输出/输入数据。