1. 干什么?
- 操作bean的,java web开发中,vo , entity 间不同对象,但是他们的属性几乎一样,beanUtil可以帮你把一个对象的属性copy到另一个属性中去!只是这其中有些注意点,规矩是工具包的作者制定的,我们得按照他的规矩来!
BeanUtils.setProperty(Obejct bean, String name, Object value); // 通过这个方法 你可以给bean的字段赋值,即使name在bean中不存在他也不会报错! // 但是如果你想通过getProperty(Obejct bean ,String name) 获得该字段的值就会 // 报NoSuchMethodException 因为它是通过反射调用getter来获得值的,而你没定义这个方法自然就会报错!
s.copyProperties(Object dest, Object orig); // 他会把orig对象的字段拷贝到dest中,但是必须保证字段名称相同 // 不同的,他会忽略 不会报错! 如果存在自定义对象,比如dest中是User ,orig中是t_usr ,但是这两个类中的字段是一样的,可以copy成功吗?entity间的映射关系 貌似不可以,会报非法访问的异常!直接copy当然不可以! 可以通过定义装换器 converter!
1. 定义转换器
public class AnimalConverter implements Converter{ // 实现这个接口 @Override public <T> T convert(Class<T> type, Object value) {// 转换后的类型 以及 要转换后的对象 T ani = null; try { ani = type.newInstance(); // 通过反射由类名获得对象 BeanUtils.copyProperties(ani, value);// 将valu中的字段复制到转换后的对象中 } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return ani; } }
2. 注册
AnimalConverter ac = new AnimalConverter(); ConvertUtils.register(ac,Animal.class); // 第二个参数表示你要转换成类型 ConvertUtils.register(ac, Fish.class);// 如果类之间的关系是一层套一层,比如person包含 annimal , animal 中又包含fish ,就要定义多个转换器
这里有一个问题,你多次注册的话,那么当进行转换时,怎么找到你要转换的类啊?这样不会重复了吗?
不会的,看源码:
// 这一步是转换的过程 value 为要转换的对象 , type为要转换成的类型 protected Object convert(Object value, Class<?> type) { // 就是这一步了,他会根据type到convertUtil里面去寻找相应的类型!所以不管你定义了多少个 // 不同类型的转换器,不会相互干扰的! Converter converter = getConvertUtils().lookup(type); if (converter != null) { log.trace(" USING CONVERTER " + converter); // 这里就会调用你实现的方法,进行转换 return converter.convert(type, value); } else { return value; } }