Java為實(shí)體類動態(tài)添加屬性的方法詳解
可以給已有實(shí)體類動態(tài)的添加字段并返回新的實(shí)體對象,不影響原來的實(shí)體對象結(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 { /** * 目標(biāo)對象 */ 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為實(shí)體類動態(tài)添加屬性的方法詳解的文章就介紹到這了,更多相關(guān)Java實(shí)體類添加屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用java反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法
下面小編就為大家?guī)硪黄胘ava反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源)
本文主要介紹了SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05JavaWeb詳細(xì)講述Cookie和Session的概念
web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對于機(jī)器來說,在一次請求之間只是會攜帶著本次請求的數(shù)據(jù)的,但是可能多次請求之間是會有聯(lián)系的,所以提供了會話機(jī)制2022-06-06SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot+SpringCloud實(shí)現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Mybatis詳解動態(tài)SQL以及單表多表查詢的應(yīng)用
MyBatis的動態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關(guān)于Mybatis超級強(qiáng)大的動態(tài)SQL語句的相關(guān)資料,需要的朋友可以參考下2022-06-06