最近工作中剥离通用功能比较多。
Maven引用:
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
不要引用太高级的版本。会存在兼容问题。本身有内部依赖。
核心类:
import net.sf.cglib.beans.*;
import java.util.*;
public class DynamicBean {
private Object object = null; //动态生成的类
private BeanMap beanMap = null; //存放属性名称以及属性的类型
public DynamicBean() {
super();
}
public DynamicBean(Map propertyMap) {
this.object = generateBean(propertyMap);
this.beanMap = BeanMap.create(this.object);
}
/**
* @param propertyMap
* @return
*/
private Object generateBean(Map propertyMap) {
BeanGenerator generator = new BeanGenerator();
Set keySet = propertyMap.keySet();
for (Iterator i = keySet.iterator(); i.hasNext(); ) {
String key = (String) i.next();
generator.addProperty(key, (Class) propertyMap.get(key));
}
return generator.create();
}
/**
* 给bean属性赋值
*
* @param property 属性名
* @param value 值
*/
public void setValue(Object property, Object value) {
beanMap.put(property, value);
}
/**
* 通过属性名得到属性值
*
* @param property 属性名
* @return 值
*/
public Object getValue(String property) {
return beanMap.get(property);
}
/**
* 得到该实体bean对象
*
* @return
*/
public Object getObject() {
return this.object;
}
}
帮助类:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.*;
public class ClassUtil {
/**
*
* @param object 旧的对象带值
* @param addMap 动态需要添加的属性和属性类型
* @param addValMap 动态需要添加的属性和属性值
* @return 新的对象
* @throws Exception
*/
public Object dynamicClass(Object object,HashMap addMap, HashMap addValMap) throws Exception {
HashMap returnMap = new HashMap();
HashMap typeMap = new HashMap();
Class<?> type = object.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(type);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
PropertyDescriptor descriptor = propertyDescriptors[i];
String propertyName = descriptor.getName();
if (!propertyName.equals("class")) {
Method readMethod = descriptor.getReadMethod();
Object result = readMethod.invoke(object);
//可以判断为 NULL不赋值
returnMap.put(propertyName, result);
typeMap.put(propertyName, descriptor.getPropertyType());
}
}
returnMap.putAll(addValMap);
typeMap.putAll(addMap);
//map转换成实体对象
DynamicBean bean = new DynamicBean(typeMap);
//赋值
Set keys = typeMap.keySet();
for (Iterator it = keys.iterator(); it.hasNext(); ) {
String key = (String) it.next();
bean.setValue(key, returnMap.get(key));
}
Object obj = bean.getObject();
return obj;
}
}
使用:
Order order = new Order();
order.setId(1);
order.setName("order1");
List<OrderDetail> orderDetailList = new ArrayList<OrderDetail>();
OrderDetail orderDetail = new OrderDetail();
orderDetail.setOrderid(1);
orderDetail.setOrderPrice("1USD");
orderDetail.setOrderSku("Sku1");
orderDetailList.add(orderDetail);
OrderDetail orderDetail2 = new OrderDetail();
orderDetail2.setOrderid(1);
orderDetail2.setOrderPrice("2USD");
orderDetail2.setOrderSku("Sku2");
orderDetailList.add(orderDetail2);
try {
HashMap addMap = new HashMap();
HashMap addValMap = new HashMap();
addMap.put("orderDetail", Class.forName("java.util.List"));
addValMap.put("orderDetail", orderDetailList);
Object obj2= new ClassUtil().dynamicClass(order,addMap,addValMap);
System.out.println(JSON.toJSONString(obj2));
} catch (Exception e) {
e.printStackTrace();
}