packagecom.xxx.bean.entity;importcom.xxx.base.common.exception.BaseException;importorg.springframework.cglib.beans.BeanGenerator;importorg.springframework.cglib.beans.BeanMap;importjava.lang.reflect.Field;importjava.util.HashMap;importjava.util.Map;/*** Created by xxxtech on 2020/4/23.*/
public classDynamicBean {/*** 目标对象*/
privateObject target;/*** 属性集合*/
privateBeanMap beanMap;/*** propertyMap: 属性名称和所属类型map*/
private MappropertyMap;public DynamicBean(Class superclass, MappropertyMap) {this.target =generateBean(superclass, propertyMap);this.beanMap = BeanMap.create(this.target);
}/*** bean 添加属性和值
*
*@paramproperty
*@paramvalue*/
public voidsetValue(String property, Object value) {
beanMap.put(property, value);
}/*** 获取属性值
*
*@paramproperty
*@return
*/
publicObject getValue(String property) {returnbeanMap.get(property);
}/*** 获取对象
*
*@return
*/
publicObject getTarget() {return this.target;
}/*** 根据属性生成对象
*
*@paramsuperclass
*@parampropertyMap
*@return
*/
private Object generateBean(Class superclass, MappropertyMap) {
BeanGenerator generator= newBeanGenerator();if (superclass != null) {
generator.setSuperclass(superclass);
}this.propertyMap =propertyMap;
BeanGenerator.addProperties(generator, propertyMap);returngenerator.create();
}/****/
public DynamicBean addPropertyToDyBean(T vo) throwsBaseException {try{
Field[] arr=vo.getClass().getDeclaredFields();
Map propertyMap = new HashMap<>();if (this.propertyMap != null && !this.propertyMap.isEmpty())
propertyMap.putAll(this.propertyMap);for(Field field : arr)
propertyMap.put(field.getName(), field.getType());
DynamicBean dyBean= newDynamicBean(vo.getClass(), propertyMap);
beanMap.forEach((k, v)->{
dyBean.setValue(k.toString(), v);
});for(Field field : arr)
dyBean.setValue(field.getName(), com.xxx.bean.util.ReflectionUtils.invokeGetter(vo, field.getName()));returndyBean;
}catch(Exception ex) {throw newBaseException(ex.getMessage(), ex);
}
}
}