BeanUtil工具类是apache commons中的项目 使用BeanUtil除了需要 commons-beanutils-1.8.3.jar 外,可能需要记录错误日志信息,再加入 commons-logging-1.1.3.jar(也是apache的) 即可
下面着重看一些例子
// 实体类User Point,这里就省去get,set方法 package com.yangwei.model; import java.util.Date; public class User { private String name; private int age; private Date birth; private Point point; } public class Point { private int x; private int y; }
package com.yangwei.test; import static org.junit.Assert.fail; import java.lang.reflect.InvocationTargetException; import org.apache.commons.beanutils.BeanUtils; import org.junit.Test; import com.yangwei.model.User; public class TestBeanUtil { @Test public void test01() { try { User u=new User(); //假设要为name设置值"zhangsan" String key="name"; String value="zhangsan"; //以前我们使用Method 调用它的invoke方法完成操作 //现在我们使用BeanUtils的copyProperty完成设值操作 BeanUtils.copyProperty(u, key, value); System.out.println(u.getName());//zhangsan //拷贝不认识的属性,也不会报错 BeanUtils.copyProperty(u, "yyy", value); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
两个转换器类 ,实现Converter接口 package com.yangwei.model; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; public class DateConverter implements Converter{ /** * 第一个参数表示要转换的类型, 第二个参数表示要转换的值 * 比如要拷贝一个字符串到日期中,第一个参数就是日期,第二个参数是字符串值 */ SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd"); @Override public Object convert(Class clz, Object obj) { if(clz!=Date.class){ return null; } try { if(obj instanceof String){ return f.parse((String) obj); } } catch (ParseException e) { e.printStackTrace(); } return null; } }
package com.yangwei.model; import org.apache.commons.beanutils.Converter; public class PointConverter implements Converter { /** * 将传递过来的值转为Point类 */ @Override public Object convert(Class clz, Object obj) { if(clz!=Point.class){ return null; } if(obj instanceof String){ String value=(String)obj; String strArr[]=value.split(","); if(strArr!=null && strArr.length==2){ Point point=new Point(); point.setX(Integer.parseInt(strArr[0])); point.setY(Integer.parseInt(strArr[1])); return point; } } return null; } }
package com.yangwei.test; import java.lang.reflect.InvocationTargetException; import java.util.Date; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.junit.Test; import com.yangwei.model.DateConverter; import com.yangwei.model.Point; import com.yangwei.model.PointConverter; import com.yangwei.model.User; public class TestBeanUtil { @Test public void test01() { try { User u=new User(); //假设要为name设置值"zhangsan" String key="name"; String value="zhangsan"; //以前我们使用Method 调用它的invoke方法完成操作 //现在我们使用BeanUtils的copyProperty完成设值操作 BeanUtils.copyProperty(u, key, value); System.out.println(u.getName());//zhangsan //拷贝不认识的属性,也不会报错 BeanUtils.copyProperty(u, "yyy", value); /** * 完整拷贝一个对象,此时会有错误,因为它不知道将Date转为何种类型 * 日期是有很多中格式情况的,如 1977-10-10 1977/10/10等 * 此时,如何处理呢??? * 需要定义转换器 定义转换器的步骤: * 1, 创建一个类,实现Converter接口 * 2,重写convert方法,实现转换 * 3,在拷贝属性之前,注册转换器 */ ConvertUtils.register(new DateConverter(), Date.class); BeanUtils.copyProperty(u, "birth", "1988-11-20"); ConvertUtils.register(new PointConverter(), Point.class); BeanUtils.copyProperty(u, "point", "12,23"); User u2=new User(); BeanUtils.copyProperties(u2, u); System.out.println(u.getName()+u.getBirth()+u.getPoint()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }