java 动态增加属性值_java动态给对象添加属性并赋值

最近工作中剥离通用功能比较多。

Maven引用:

cglib

cglib

2.2.2

不要引用太高级的版本。会存在兼容问题。本身有内部依赖。

核心类:

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

ListorderDetailList = new ArrayList();

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

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值