先看个例子:
- class Person{
- private String name;
- private Date birthday;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- @Override
- public String toString(){
- return "name = " + this.name+" " + "birthday = " + this.birthday;
- }
- }
-
- public static void main(String[] args) throws Exception {
- String bd = "1991-01-01";
- Person p = new Person();
- BeanUtils.setProperty(p, "name", "zhangxx");
- System.out.println(p);
- }
输出结果很明显:name = zhangxx birthday = null
现在我添加一个转换器,代码如下
- class MyConverter implements Converter {
-
- public Object convert(Class type, Object value) {
- return "lixx";
- }
- }
-
-
- public static void main(String[] args) throws Exception {
- String bd = "1991-01-01";
- Person p = new Person();
- MyConverter c = new MyConverter();
- ConvertUtils.register(c,String.class);
- BeanUtils.setProperty(p, "name", "zhangxx");
- System.out.println(p);
- }
输出结果是:name = lixx birthday = null
由上面的可以看出,BeanUtils.setProperty给对象属性赋的值,是转换器返回的值
如上面我为String类型注册了一个转换器,转化器返回值为lixx,那么Perspon中的所有类型为String的属性 赋的值都为lixx
因为ConvertUtils.register函数支持8种基本类型与String自动转换
所以当我们属性的类型为8种基本类型时,我们赋的值为String类型时,可以不用考虑ConvertUtils.register方法
但当属性值不是8种基本类型,而我们赋String类型,则需要重写ConvertUtils.register方法
如BeanUtils.setProperty(p, "birthday", bd);这个语句会报错,我们需要注册一个Date转换器。
ps:类型一致赋值也是成功的,像BeanUtils.setProperty(p,"birthday",new Date())是可行的