net.sf.cglib.beans 中有些工具可以动态生成、操作Bean,对Bean进行一些增强操作
net.sf.cglib.beans.BeanGenerator ---动态生成对象
net.sf.cglib.beans.BeanMap ---将对象转化成map进行操作
net.sf.cglib.beans.BeanCopier ---对象属性值复制
net.sf.cglib.proxy.Mixin ---Bean混入,将几个对象合并成一个对象
利用以上工具实现下列工具类,在实体动态增强上有一定帮助。
/**
* @author Jenson
*/
@Slf4j
public class CglibBeanUtil {
/**
* 使用Map(字段名->字段类型)创建对象
*
* @param fieldMap 字段名->字段类型映射
* @return 创建好的对象
*/
public static Object createBean(Map<String, Class> fieldMap) {
BeanGenerator generator = new BeanGenerator();
for (String fieldName : fieldMap.keySet()) {
generator.addProperty(fieldName, fieldMap.get(fieldName));
}
return generator.create();
}
/**
* 使用Map(字段名->字段类型)创建对象并赋值
*
* @param fieldMap 字段名->字段类型 映射
* @param valueMap 字段名->值 映射
* @return 创建好的对象
*/
public static Object createBean(Map<String, Class> fieldMap, Map<String, Object> valueMap) {
Object bean = createBean(fieldMap);
BeanMap beanMap = BeanMap.create(bean);
for (String fieldName : valueMap.keySet()) {
beanMap.put(fieldName, valueMap.get(fieldName));
}
return bean;
}
/**
* 合并多个对象
*
* @param objects 合并对象数组
* @return 合并后生成的新对象
*/
public static Object mixinBean(Object... objects) {
return Mixin.createBean(objects);
}
/**
* 将一个对象转化为另一个对象,可用于混入对象转化为原有对象
* 使用BeanCopier实现
*
* @param sourceBean 来源对象
* @param targetClass 目标类
* @return 转化后产生的对象
*/
public static Object transformBean(Object sourceBean, Class targetClass) throws IllegalAccessException, InstantiationException {
BeanCopier copier = BeanCopier.create(sourceBean.getClass(), targetClass, false);
Object targetBean = targetClass.newInstance();
copier.copy(sourceBean, targetBean, null);
return targetBean;
}
/**
* 将一个对象的属性复制到另一个对象
*
* @param sourceBean 来源对象
* @param targetBean 目标对象
*/
public static void copyBean(Object sourceBean, Object targetBean) {
BeanCopier copier = BeanCopier.create(sourceBean.getClass(), targetBean.getClass(), false);
copier.copy(sourceBean, targetBean, null);
}
}
网友评论