[JAVA] java.beans API 用例

先创建一个 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 无法正常输出/输入数据。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据