BeanUtil工具包的使用

 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;
        }
    }

猜你喜欢

转载自kainever7.iteye.com/blog/2200283