基于JavaBean编辑器读取peroperties文件

其他

还多关于JavaBean以及及时片只接口的学问,能够买当下按照开《了解Spring+4.x++公司应用开发实战》,或者看本身的Copy

BeanInfo接口

BeanInfo用于描述JavaBean哪些性能够编制和对应属性编辑器。Java为BeanInfo也提供了一个默认实现–SimpleBeanInfo。

测试

GenderPropertyEditor

GenderPropertyEditor紧尽管将表面得到到的字符串去换为Gender,其实现思路是,先品尝用该字符串转换为Integer类型,倘若换成则以更换得到Integer值通过Gender枚举的静态方法getGender(int
id)获取Gender类型的变量;尽管换失败,则拿拖欠字符串看作genderName,再夺取得Gender。至于Gender到字符串,直接再次来到genderName就可了。首要代码如下:

@Override
public String getAsText() {
    Gender value =  (Gender)getValue();
    return value.getGenderName();
}

@Override
public void setAsText(String value) throws IllegalArgumentException {
    try {
        setValue(Gender.getGender(Integer.valueOf(value)));
    }catch(NumberFormatException ex) {
        setValue(Gender.getGender(value));
    }       
}

一个有些例子

在《通晓Spring+4.x++集团应用开发实战》中应用的例证是基于《Core Java
II》的一个事例改变而变成,然而来一个聊瑕疵,该例子使用到了Swing,演示时得将代码打成JAR包,使用IDE组件扩充管理力量注册到IDE中,不绝方便,因而自专门尝试用JavaBean编辑器读取properties文件作为一个有些例子。

JavaBean简单介绍

JavaBean是同样栽Java写成的可重用组件,本质上要一个Java类,然而和一般的Java类不同,JavaBean必须发一个无参的构造函数,其字段必须私有化,并提供set、get方法供外界用。依据书被所介绍,Sun所制定的JavaBean规范大死程度山是为了IDE准备的–它为IDE能够以可视化的章程设置JavaBean的性质。

测试结果

Person [name=arthurming, age=18, gender=M, birthday=Tue Oct 24 00:00:00 CST 2017, married=true]

引言

近年于重读《了解Spring+4.x++集团应用开发实战》这遵照开,看到了有关JavaBean编辑器的一些,领会及PropertyEditor和BeanInfo的行使。不得不说,BeanInfo是一个良强大的物,Java中的反思也跟之起一点点稍关联。

DatePropertyEditor

DatePropertyEditor的笔触及GenderPropertyEditor相似,其要旨代码献上:

private DateFormat df;

@Override
public String getAsText() {
    Date date = (Date)getValue();
    return df.format(date);
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    try {
        setValue(df.parse(text));
    } catch (ParseException e) {
        throw new IllegalArgumentException(e);      
    }
}

public DatePropertyEditor() {
    super();
    this.df = new SimpleDateFormat("yyyy-MM-dd");
}

实现PropertyEditor

Person类中生5个字段,分别用String、int、Gender、Date和boolean这5惨遭列,其中对String类型变量name我们下PropertyEditorSupport这些默认实现即好了,其他的花色我们需要从定义去实现PropertyEditor接口–int对诺IntegerPropertyEditor、Gender对诺GenderPropertyEditor、Date对应DatePropertyEditor以及boolean对应BooleanPropertyEditor。

PropertyEditor接口

PropertyEditor是性质编辑器的接口,其功能是将一个String类型的值转换为JavaBean的特性。Java也PropertyEditor提供了一个默认的贯彻类似PropertyEditorSupport。

始建布局文件

因我创设的凡一个一般性的Java项目,因而自选以src目录下创办person.properites文件,文件内容如下:

name=arthurming
age=18
gender=1
birthday=2017-10-24
married=true

测试代码

    @Test
    public void test() throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        Properties p = new Properties();
        InputStream is =this.getClass().getClassLoader().getResourceAsStream("person.properties");
        p.load(is);
        BeanInfo beanInfo = new PersonBeanInfo();
        PropertyDescriptor[] propertyDescriptoies = beanInfo.getPropertyDescriptors();
        Person person = new Person();
        for(PropertyDescriptor propertyDescriptor : propertyDescriptoies) {
            String key  = propertyDescriptor.getName();
            String value = p.getProperty(key);
            Method method = propertyDescriptor.getWriteMethod();
            PropertyEditor pe = (PropertyEditor) propertyDescriptor.getPropertyEditorClass().newInstance();
            if(pe.getClass() == PropertyEditorSupport.class) { //①
                pe.setValue(value);
            } else {
                pe.setAsText(value);            
            }
            method.invoke(person,pe.getValue());
        }
        System.out.println(person);
    }

征:代码①意味当pe类型是PropertyEditorSupport,而不是自身所定义PropertyEdtior,应该利用setValue方法要无是setAsText方法。
因为在PropertyEditorSupport中,其setAsText()方法为:

public void setAsText(String text) throws java.lang.IllegalArgumentException {
    if (value instanceof String) {
        setValue(text);
        return;
    }
    throw new java.lang.IllegalArgumentException(text);
}

要下setAsText()方法,那么由value不是String类型,将会丢掉来IllegalArgumentException。但是那么些遗憾自己搞懂value到底实际上什么类型……

IntegerPropertyEditor

IntegerPropertyEditor类继承了PropertyEditorSupport类和贯彻PropertyEditor接口(个人习惯落实接口的当儿以继续一个默认实现,这样我可以只是关注我所需要实现的章程,当然,这多少个默认实现最好是一个抽象类),重写了getAsText()方法及setAsText(String
text),其代码如下:

@Override
public String getAsText() {
    return String.valueOf((int)getValue());
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    try {
        setValue(Integer.parseInt(text));
    } catch(NumberFormatException e) {
            throw new IllegalArgumentException(e);
    }
}

小结

倍感您能耐受自己拙劣的文笔看到前日,也可望你于宣读《精晓Spring+4.x++集团应用开发实战》这仍开时,看到有关JavaBean编辑器的学问,我的那一个事例可以对您具备助。

概念一个JavaBean

我们先行定义一个Person类,用作JavaBean

/**
 * 一个简单的JavaBean
 * @author aming
 *
 */
public class Person implements Serializable {

    private static final long serialVersionUID = 6366021085463785872L;

    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
    /**
     * 性别
     */
    private Gender gender;
    /**
     * 生日
     */
    private Date birthday;
    /**
     * 是否结婚
     */
    private boolean married;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public boolean isMarried() {
        return married;
    }
    public void setMarried(boolean married) {
        this.married = married;
    }

    public Person() {
        super();
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", birthday=" + birthday + ", married="
                + married + "]";
    }
}

里面Gender是自己自从定义之枚举,其代码如下:

/**
 * 表示性别的枚举类
 * @author aming
 *
 */
public enum Gender {
    M(1,"男"),F(2,"女");
    private int id;
    private String genderName;

    public String getGenderName() {
        return genderName;
    }

    Gender(int id,String genderName){
        this.id = id;
        this.genderName = genderName;
    }

    public static Gender getGender(int id) {
        for(Gender gender:values()) {
            if(gender.id == id) {
                return gender;
            }
        }
        return M;
    }

    public static Gender getGender(String genderName) {
        for(Gender gender:values()) {
            if(gender.genderName == genderName) {
                return gender;
            }
        }
        return M;
    }
}

JavaBean、PropertyEditor与BeanInfo

自定义BeanInfo

概念PersonBeanInfo类,用于描述Person属性和相呼应的PropertyEditor。代码如下:

public class PersonBeanInfo extends SimpleBeanInfo implements BeanInfo {

    @Override
    public PropertyDescriptor[] getPropertyDescriptors() {
        List<PropertyDescriptor> list = new ArrayList<>();
        try {
            // 将Person中name与PropertyEditorSupport绑定
            PropertyDescriptor namePropertyDescriptor = new PropertyDescriptor("name",Person.class);
            namePropertyDescriptor.setPropertyEditorClass(PropertyEditorSupport.class);
            // 将Person中age与IntegerPropertyEditor绑定
            PropertyDescriptor agePropertyDescriptor = new PropertyDescriptor("age",Person.class);
            agePropertyDescriptor.setPropertyEditorClass(IntegerPropertyEditor.class);
            // 将Person中gender与GenderPropertyEditor绑定
            PropertyDescriptor genderPropertyDescriptor = new PropertyDescriptor("gender", Person.class);
            genderPropertyDescriptor.setPropertyEditorClass(GenderPropertyEditor.class);
            // 将Person中birthday与DatePropertyEditor绑定
            PropertyDescriptor birthdayPropertyDescriptor = new PropertyDescriptor("birthday",Person.class);
            birthdayPropertyDescriptor.setPropertyEditorClass(DatePropertyEditor.class);
            // 将Person中married与BooleanPropertyEditor绑定
            PropertyDescriptor marriedPropertyDescriptor = new PropertyDescriptor("married",Person.class);
            marriedPropertyDescriptor.setPropertyEditorClass(BooleanPropertyEditor.class);

            list.add(namePropertyDescriptor);
            list.add(agePropertyDescriptor);
            list.add(genderPropertyDescriptor);
            list.add(birthdayPropertyDescriptor);
            list.add(marriedPropertyDescriptor);

            return list.toArray(new PropertyDescriptor[list.size()]);
        } catch (IntrospectionException ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

补充

1024,节日快乐

BooleanPropertyEditor

BooleanPropertyEditor同IntegerPropertyEditor一样,实现好类似:

@Override
public String getAsText() {
    return String.valueOf((boolean)getValue());
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    setValue(Boolean.valueOf(text));
}

相关文章