- default constructible,即可以默认构造,但这个并不保证对应的 bean 处于 valid 状态
- 所有的“属性”都含有 getter/setter 方法,这两个方法必须满足前者返回对应类型不带参数,后者带一个参数返回 void
- 实现了 java.io.Serializable,这包括 readObject、writeObject 和 readObjectNoData 三个方法
正因为以上原因,beans 其实与某个 java package 是独立的,但是处理 beans 需要的一些手段被抽象出来,SDK 里面提供了 java.beans 这个 package,其中很多接口就能看出来主要是为了让这些 beans 与 IDE 等 framework 更好工作,比如
- BeanInfo 获得 bean 的一些 property 等信息,Customizer 用来为 bean 某些信息进行更新
- DesignMode 用来判断是否在设计界面(如 applet 的设计),PropertyEditor 用来帮助编辑属性
当然 java.beans 提供的一些支持还比较接近底层,特别是和 IDE 打交道的部分,同时里面还提供了两个类跟这里 Betwixt 有关,那就是 XMLDecoder 和 XMLEncoder,两者负责将一个 bean 写到 XML 文件里面或者从里面构造出一个 bean。Betwixt 的目标就是将这个转换过程变成可以控制的,通过尽量少的代价干涉定制者得到需要的效果。直接用 XMLEncoder 的话大致如下
import java.beans.XMLEncoder ; public class TestBeanCodec { private int age ; public int getAge () { return age ; } public void setAge (int a) { age = a ; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main (String[] args) { TestBeanCodec bean = new TestBeanCodec () ; bean.setAge (5) ; bean.setName ("foo") ; XMLEncoder encoder = new XMLEncoder (System.out) ; encoder.writeObject (bean) ; encoder.close () ; } }使用 betwixt 的话我们为每个 class 提供一个 class.betwixt 文件打包到 jar 里面,之后使用 org.apache.commons.betwixt 里面的 BeanWriter/BeanReader 就能进行定制化的输入输出了。
参看 userguide、API 和例子。
No comments:
Post a Comment