今天在学习工具beanutils时候遇到一个问题,基本情况是这样的
定义了一个Javabean:Student,其中一个属性是Date类型的birthday,使用BeanUtils.copyProperty(bean, name, value)方法的时候遇到要拷贝时间类型进入Student中
copyProperty方法在源码中实现了对value是字符串情况的默认转换,可以将字符串转换为int,boolean等等,但是不支持时间日期类型的默认转换,所以要自定义一个日期类型的转换器并进行注册,下面是代码:
//通过类路径,反射得到一个对象,然后再对其属性进行操作
Object s = Class.forName("com.thunder.test.beanutils.Student").newInstance();
/**
* beanutils的copyproperty方法内部将不合适的类型可以转换成对应的类型
* 即可以将下面的id(int类型的)用,字符串传入;
* 但是默认的日期转换器不能把字符串转换成日期类型,所以我们要自己注册一个可以办到的日期转换器
* */
ConvertUtils.register(new MyConverter(), Date.class);//这里是注册转换器的语句,注册的是自定义的转换器对象
BeanUtils.copyProperty(s, "id", "4");
BeanUtils.copyProperty(s, "name", "jack");
BeanUtils.copyProperty(s, "gender", "true");
BeanUtils.copyProperty(s, "birth", "2016/05/12 16:20:12");
System.out.println(s);
自定义转换器里面定义的时间格式是需要匹配在copyProperty中输入的时间格式,将该格式的字符串通过格式化之后的sdf对象转换为时间对象并返回,即可达到输入时虽然是字符串但是返回是Date对象的目的,那么注意了,还有一个问题,就是虽然Javabean中的成员变量是Date类型的,但是输出的时间格式对用户并不友好,不是常用的格式,为了解决这个问题,我们可以在toString中进行一下处理(在将全部变量都输出的情况下):重新定义你想要的时间的格式,再次通过格式化时间对象(返回的 是字符串类型)输出该字符串。如果是单独输出该时间类型的变量那就单独处理一下吧,总之在不将Date对象处理为String类型的对象的前提下,输出的Date对象都是非友好格式的
下面是自定义的转换器:
//自定义一个日期转换器
class MyConverter implements Converter {
@Override
public Object convert(Class type, Object value) {
//定义一个日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
//判断是否是要转换成日期格式
if(type==Date.class) {
String date = (String)(value);
try {
Date curDate = sdf.parse(date);
return curDate;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
下面是处理toString的代码:
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", scores=" + scores + ", birth="
+ sdf.format(birth)//这是一个字符串类型的格式化日期时间
+ "]";
}