Java為實體類動態(tài)添加屬性的方法詳解
可以給已有實體類動態(tài)的添加字段并返回新的實體對象,不影響原來的實體對象結(jié)構(gòu)。
添加依賴
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
代碼
import com.google.common.collect.Maps;
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.PropertyDescriptor;
import java.util.Map;
/**
* 動態(tài)為bean添加字段
* @Author gongl
* @Create 2022-01-11
*/
public class DynamicBeanUtils {
private static final Logger logger = LoggerFactory.getLogger(DynamicBeanUtils.class);
public static Object getTarget(Object dest, Map<String, Object> addProperties) {
PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
//得到原對象的屬性
PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
Map<String, Class<?>> propertyMap = Maps.newHashMap();
for (PropertyDescriptor d : descriptors) {
if (!"class".equalsIgnoreCase(d.getName())) {
propertyMap.put(d.getName(), d.getPropertyType());
}
}
addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
//構(gòu)建新的對象
DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
for (Map.Entry<String, Class<?>> entry : propertyMap.entrySet()) {
try {
if (!addProperties.containsKey(entry.getKey())) {//原來的值
dynamicBean.setValue(entry.getKey(), propertyUtilsBean.getNestedProperty(dest, entry.getKey()));
}else {//新增的值
dynamicBean.setValue(entry.getKey(), addProperties.get(entry.getKey()));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
return dynamicBean.getTarget();
}
private static class DynamicBean {
/**
* 目標對象
*/
private Object target;
/**
* 屬性集合
*/
private BeanMap beanMap;
public DynamicBean(Class<?> superclass, Map<String, Class<?>> 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;
}
/**
* 根據(jù)屬性生成對象
*
* @param superclass
* @param propertyMap
* @return
*/
private Object generateBean(Class<?> superclass, Map<String, Class<?>> propertyMap) {
BeanGenerator generator = new BeanGenerator();
if (null != superclass) {
generator.setSuperclass(superclass);
}
BeanGenerator.addProperties(generator, propertyMap);
return generator.create();
}
}
}
測試
public static class TestBean{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
TestBean bean = new TestBean();
bean.setName("張三");
Map<String, Object> map = new HashMap<>();
map.put("age", 29);
//添加參數(shù)age--->29
Object obj = DynamicBeanUtils.getTarget(bean, map);
//打印結(jié)果
Method[] declaredMethods = obj.getClass().getDeclaredMethods();
for(Method method:declaredMethods){
if(method.getName().startsWith("get")){
Object o=method.invoke(obj);
System.out.println("屬性值get方法->"+o);
}
}
}
結(jié)果打印出name和age的值

到此這篇關(guān)于Java為實體類動態(tài)添加屬性的方法詳解的文章就介紹到這了,更多相關(guān)Java實體類添加屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用java反射機制實現(xiàn)自動調(diào)用類的簡單方法
下面小編就為大家?guī)硪黄胘ava反射機制實現(xiàn)自動調(diào)用類的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源)
本文主要介紹了SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實現(xiàn)解析
這篇文章主要介紹了SpringBoot+SpringCloud實現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
Mybatis詳解動態(tài)SQL以及單表多表查詢的應(yīng)用
MyBatis的動態(tài)SQL是基于OGNL表達式的,它可以幫助我們方便的在SQL語句中實現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關(guān)于Mybatis超級強大的動態(tài)SQL語句的相關(guān)資料,需要的朋友可以參考下2022-06-06

