最近在重读《精通弹簧+ x + 4. +企业应用开发实战》这本的书,看到了有关JavaBean编辑器的部分,了解到PropertyEditor和BeanInfo的使用。不得不说,BeanInfo是一个很强大的东西,Java中的内省也与之有一点点小关联。
<强> JavaBean, PropertyEditor与BeanInfo 强>
JavaBean是一种Java写成的可重用组件,本质上还是一个Java类,但是与一般Java类的不同,JavaBean必须有一个无参的构造函数,其字段必须私有化,并提供,让方法供外界使用。根据书中所介绍,太阳所制定的JavaBean规范很大程度山是为了IDE准备的——它让IDE能够以可视化的方式设置JavaBean的属性。
PropertyEditor是属性编辑器的接口,其作用是将一个字符串类型的值转换为JavaBean的属性. java为PropertyEditor提供了一个默认的实现类PropertyEditorSupport。
BeanInfo用于描述JavaBean哪些属性可以编辑及对应属性编辑器. java为BeanInfo也提供了一个默认实现——SimpleBeanInfo。
更多有关JavaBean以及这两个接口的知识,可以购买这本书《精通弹簧+ x + 4. +企业应用开发实战》,或者看我的复制
<强>一个小例子强>
在《精通弹簧+ 4。x + +企业应用开发实战》中使用的例子是根据《核心Java II》的一个例子改变而成,但是有一个小缺点,该例子使用到了秋千,演示时需要将代码打成JAR包,使用IDE组件扩展管理功能注册到IDE中,不太方便,因此我特意尝试用JavaBean编辑器读取属性文件作为一个小例子。
我们先定义一个人类,用作JavaBean
/* * *一个简单的JavaBean * @author在 * */公共类人实现Serializable { 私有静态最终长serialVersionUID=6366021085463785872 l;/* * * 姓名 */私人字符串名称;/* * * 年龄 */私人int年龄;/* * *性别 */私人性别性别;/* * *生日 */私人生日日期;/* * *是否结的婚 */私人布尔结婚; 公共字符串getName () { 返回名称; } 公共空间setName(字符串名称){ this.name=名称; } 公共int getAge () { 返回年龄; } 公共空间setAge (int年龄){ 这一点。年龄=年龄; } 公众的性别getGender () { 返回性别; } 公共空间setGender(性别性别){ 这一点。性别=性别; } 上市日期getBirthday () { 返回的生日; } 公共空间setBirthday(日期的生日){ 这一点。生日=生日; } 公共布尔isMarried () { 返回结婚; } 公共空间setMarried(布尔结婚){ 这一点。结婚=结婚; } 公众人物(){ 超级(); } @Override 公共字符串toString () { 返回“人(name=" +名字+ ",年龄=? +”时代,性别=" +性别+”,生日=生日“+ +”,结婚=" +结婚+“]”; } }
其中性别是我自定义的枚举,其代码如下:
/* * *表示性别的枚举类 * @author在 * */公共enum性别{ M(1,“男”),F(2,“女”); 私人int id; 私人字符串genderName; 公共字符串getGenderName () { 返回genderName; } 性别(int id字符串genderName) { 这一点。id=id; 这一点。genderName=genderName; } 公共静态性别getGender (int id) { (性别性别:值()){ 如果性别。id==id) { 返回性别; } } 返回M; } 公共静态性别getGender(字符串genderName) { (性别性别:值()){ 如果性别。genderName==genderName) { 返回性别; } } 返回M; } }
<>强实现PropertyEditor 强>
人类中有5个字段,分别使用字符串,int,性别、日期和布尔这5中类型,其中对字符串类型变量名称我们使用PropertyEditorSupport这个默认实现就可以了,其他的类型我们需要自定义去实现PropertyEditor接口,int对应IntegerPropertyEditor,性别对应GenderPropertyEditor,日期对应DatePropertyEditor以及布尔对应BooleanPropertyEditor。
<强> IntegerPropertyEditor 强>
IntegerPropertyEditor类继承了PropertyEditorSupport类和实现PropertyEditor接口(一个人习惯实现接口的时候同时继承一个默认实现,这样我可以只关心我所需要实现的方法,当然,这个默认实现最好是一个抽象类),重写了getAsText()方法和setAsText文本(字符串),其代码如下: