java类添加属性_Java 类动态添加属性字段的操作

说明:

做项目中遇到一种场景,需要根据查询时间段, 获取时间段中中每个月份对应的金额(费用统计)。

如截图中的两列

8fce0fbf098ed336cd4ff7c8b9abe89e.png

因为列是动态的, 首先想到的就是后天拼接json格式字符串, 然后返回到前台, 组装表头及内容。

但是当前系统中easyui版本为1.2,并不支持 data属性(官方从1.3.2开始支持)。所以只能返回list 格式。

网上一搜相关代码很多, 看客可以自己搜索一下。 我这里记录一下我当时使用场景及用法,已备以后使用。

1.需要引用cglib jar包, 我用的版本是2.2

2.建一个实体对象 dynamicbean.java 。主要用来处理对象。

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

}

/**

* 返回新生成的对象

* @return

*/

public object getobject() {

return this.object;

}

}

3. 原来对象, 及需要拼接到对象中的属性字段集合处理方法。

/**

*参数说明:

* object : 查询结果数组中对象。

* moneymap : 为对象对应所有月份数据集合

* 解释:已经查询出一组账单对象集合list , 而moneymap为对象中的一个属性

* map, 存放了月份及金额

*/

private object dynamicclass(object object, map moneymap) throws exception {

// 字段 - 值 集合

hashmap returnmap = new hashmap();

// 字段 - 字段类型 集合

hashmap typemap = new hashmap();

// 获取传入类

class extends object> 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") && !propertyname.equals("monthmap")) {

method readmethod = descriptor.getreadmethod();

object result = readmethod.invoke(object, new object[0]);

if (result != null) {

returnmap.put(propertyname, result);

} else {

string propertytype = descriptor.getpropertytype().tostring();

if (propertytype.contains("java.math.bigdecimal")) {

returnmap.put(propertyname, new bigdecimal(0));

} else {

returnmap.put(propertyname, "");

}

}

typemap.put(propertyname, descriptor.getpropertytype());

}

}

// 获取月份数据, 变为字段属性

set monthkeys = moneymap.keyset();

for (iterator it = monthkeys.iterator(); it.hasnext();) {

string key = (string) it.next();

// 字段类型

typemap.put(key, class.forname("java.math.bigdecimal"));

// 字段对应值

returnmap.put(key, moneymap.get(key));

}

// 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;

}

做笔记使用, 说不定以后还会用到。

补充:java动态的生成类的属性、并赋值

1、springboot项目中,在build.gradle中,配置jar包

compile("commons-beanutils:commons-beanutils:1.9.3")

compile("cglib:cglib-nodep:3.2.4")

2、创建dynamicbean

import java.util.map;

import net.sf.cglib.beans.beangenerator;

import net.sf.cglib.beans.beanmap;

public class dynamicbean {

/**

* 目标对象

*/

private object target;

/**

* 属性集合

*/

private beanmap beanmap;

public dynamicbean(class superclass, map propertymap){

this.target = generatebean(superclass, propertymap);

this.beanmap = beanmap.create(this.target);

}

/**

* bean 添加属性和值

*

* @param property

* @param value

*/

public void setvalue(string property, object value) {

beanmap.put(property, value);

}

/**

* 获取属性值

*

* @param property

* @return

*/

public object getvalue(string property) {

return beanmap.get(property);

}

/**

* 获取对象

*

* @return

*/

public object gettarget() {

return this.target;

}

/**

* 根据属性生成对象

*

* @param superclass

* @param propertymap

* @return

*/

private object generatebean(class superclass, map propertymap) {

beangenerator generator = new beangenerator();

if (null != superclass) {

generator.setsuperclass(superclass);

}

beangenerator.addproperties(generator, propertymap);

return generator.create();

}

}

3、创建reflecutil转换的工具类

import java.beans.propertydescriptor;

import java.util.hashmap;

import java.util.map;

import org.apache.logging.log4j.logmanager;

import org.apache.logging.log4j.logger;

import org.apache.commons.beanutils.propertyutilsbean;

import com.sunxung.factoring.entity.dynamicbean;

import com.sunxung.factoring.entity.attendancemanagement.attendancevo;

/**

* @classname:reflectutil

* @description:动态生成类的属性、并且赋值

* @date:2018年4月3日 下午2:33:10

*/

public class reflectutil {

static logger logger = logmanager.getlogger(reflectutil.class);

@suppresswarnings("rawtypes")

public static object gettarget(object dest, map addproperties) {

propertyutilsbean propertyutilsbean = new propertyutilsbean();

propertydescriptor[] descriptors = propertyutilsbean.getpropertydescriptors(dest);

map propertymap = new hashmap<>();

for (propertydescriptor d : descriptors) {

if (!"class".equalsignorecase(d.getname())) {

propertymap.put(d.getname(), d.getpropertytype());

}

}

// add extra properties

addproperties.foreach((k, v) -> propertymap.put(k, v.getclass()));

// new dynamic bean

dynamicbean dynamicbean = new dynamicbean(dest.getclass(), propertymap);

// add old value

propertymap.foreach((k, v) -> {

try {

// filter extra properties

if (!addproperties.containskey(k)) {

dynamicbean.setvalue(k, propertyutilsbean.getnestedproperty(dest, k));

}

} catch (exception e) {

logger.error(e.getmessage(), e);

}

});

// add extra value

addproperties.foreach((k, v) -> {

try {

dynamicbean.setvalue(k, v);

} catch (exception e) {

logger.error(e.getmessage(), e);

}

});

object target = dynamicbean.gettarget();

return target;

}

public static void main(string[] args) {

attendancevo entity = new attendancevo();

map addproperties = new hashmap<>();

addproperties.put("day31", "你好");

attendancevo newvo = (attendancevo) gettarget(entity, addproperties);

system.out.println(newvo.getday0());

}

}

4、在项目中动态生成属性并且赋值的使用

private attendancevo autodetailnew(searchattendancevo search, attendancevo att) {

search.setdingdinguserid(att.getdingdinguserid());

list detaillist = attendancemapper.finddetaillist(search);

map addproperties = new hashmap<>();

for (attendance attendance : detaillist) {

addproperties.put("day" + dateutil.getdaystringformatymd(attendance.getattendancedate()),

attendance.getremark());

}

attendancevo newvo = (attendancevo) reflectutil.gettarget(att, addproperties);

return newvo;

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持萬仟网。如有错误或未考虑完全的地方,望不吝赐教。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值