cglib简单使用

2021-01-22  本文已影响0人  东南枝下

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


上一篇 下一篇

猜你喜欢

热点阅读