package com.persagy.fm.translate.extension; import com.persagy.fm.common.utils.ProxyBeanUtil; import com.persagy.fm.translate.model.ITransWrapper; import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.beans.BeanGenerator; import java.util.Collection; import java.util.Map; /** * 基于对象的包装 * @author Charlie Yu * @Date 2021-03-03 */ public class BeanTransWrapperBuilder implements ITransWrapperBuilder{ /** * 是否需要替换原始对象 */ private boolean isMap; /** * 扩展项 */ private Collection extendProps = null; /** * 对象类 */ private Class clazz = null; /** * 新的扩展类 */ private Class newClass = null; /** * 生成器 */ private BeanGenerator gen; /** * 是否存在扩展 */ private boolean extend = false; /** * 构造方法 * @param clazz 对象类 */ public BeanTransWrapperBuilder(Class clazz){ this.isMap = Map.class.isAssignableFrom(clazz); this.clazz = clazz; } @Override public ITransWrapper createWrapper(Object origion) { if(isMap) { return new MapTransWrapper((Map) origion); } if(extend && gen == null){ gen = ProxyBeanUtil.createBeanGenerator(origion, extendProps.toArray(new String[0])); if(gen == null) { extend = false; } else { newClass = (Class) gen.createClass(); } } Object target = null; if(extend){ BeanCopier copier = BeanCopier.create(this.clazz,newClass,false); target = gen.create(); copier.copy(origion,target,null); } return new BeanTransWrapper(origion, target); } @Override public boolean isNeedReplaceOrigin() { return !isMap; } @Override public void setExtendProps(Collection extendProps) { if(extendProps != null && extendProps.size() > 0) { this.extendProps = extendProps; extend = true; }else { extend = false; } } }