成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java cglib為實體類(javabean)動態添加屬性方式

瀏覽:3日期:2022-08-16 16:44:05
1.應用場景

Java cglib為實體類(javabean)動態添加屬性方式

之前對接三方平臺遇到一個參數名稱是變化的,然后我就想到了動態javabean怎么生成,其實是我想多了,用個map就輕易解決了,但還是記錄下動態屬性添加的實現吧。

2.引入依賴

<!--使用cglib 為javabean動態添加屬性--> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.2.4</version> </dependency>3.代碼如下

import com.freemud.waimai.menu.dpzhcto.dto.DynamicBean; import com.google.common.collect.Maps; import org.apache.commons.beanutils.PropertyUtilsBean; import java.beans.PropertyDescriptor; import java.util.Map; public class PicBeanAddPropertiesUtil { public static Object getTarget(Object dest, Map<String, Object> addProperties) { // get property map 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()); } } // 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) { e.printStackTrace(); } }); // add extra value addProperties.forEach((k, v) -> { try { dynamicBean.setValue(k, v); } catch (Exception e) { e.printStackTrace(); } }); Object target = dynamicBean.getTarget(); return target; } }

import net.sf.cglib.beans.BeanGenerator;import net.sf.cglib.beans.BeanMap;import java.util.Map;public 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; } /** * 根據屬性生成對象 * * @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 void main(String[] args) { FinalPicBaseReqDto entity = new FinalPicBaseReqDto(); entity.setAppKey('eee'); entity.setContent('222'); Map<String, Object> addProperties = new HashMap() {{ put('動態屬性名', '動態屬性值'); }}; FinalPicBaseReqDto finalPicBaseReqVo = (FinalPicBaseReqDto) PicBeanAddPropertiesUtil.getTarget(entity, addProperties); System.out.println(JSON.toJSONString(finalPicBaseReqVo)); }

Java cglib為實體類(javabean)動態添加屬性方式

Java cglib為實體類(javabean)動態添加屬性方式

可以看到實體類只有兩個屬性,但是最終是動態添加進去了新的屬性。

聲明:代碼也是前人造的輪子,歡迎各位拿去使用,解決實際生產中遇到的相似場景問題

補充:JavaBean動態添加刪除屬性

1.cglib

BeanGenerator beanGenerator = new BeanGenerator();beanGenerator.addProperty('id', Long.class);beanGenerator.addProperty('username', String.class);Object obj = beanGenerator.create();BeanMap beanMap = BeanMap.create(obj);BeanCopier copier = BeanCopier.create(User.class, obj.getClass(), false);User user = new User();user.setId(1L);user.setUsername('name1');user.setPassword('123');copier.copy(user, obj, null);System.out.println(beanMap.get('username'));Class clazz = obj.getClass();Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {System.out.println(methods[i].getName());}

輸出結果:

name1getIdgetUsernamesetIdsetUsername

從輸出結果可以看出最后生成的obj只有id和username兩個屬性

2.org.apache.commons.beanutils

DynaProperty property = new DynaProperty('id', Long.class);DynaProperty property1 = new DynaProperty('username', String.class);BasicDynaClass basicDynaClass = new BasicDynaClass('user', null, newDynaProperty[]{property, property1});BasicDynaBean basicDynaBean = new BasicDynaBean(basicDynaClass);User user = new User();user.setId(1L);user.setUsername('name1');user.setPassword('123');BeanUtils.copyProperties(basicDynaBean, user);Map<String, Object> map = basicDynaBean.getMap();Iterator<String> it = map.keySet().iterator();while (it.hasNext()) { String key = it.next();System.out.println(key + ':' + map.get(key));}

輸入結果:

id:1username:name1

查看BasicDynaBean與BasicDynaClass之間的關系

Java cglib為實體類(javabean)動態添加屬性方式

DynaBean的源碼

public interface DynaBean {public boolean contains(String name, String key);public Object get(String name);public Object get(String name, int index);public Object get(String name, String key);public DynaClass getDynaClass();public void remove(String name, String key);public void set(String name, Object value);public void set(String name, int index, Object value);public void set(String name, String key, Object value);}

主要是接口的定義

再來看看BasicDynaBean是怎么實現的,直接看public Object get(String name);

/*** Return the value of a simple property with the specified name.** @param name Name of the property whose value is to be retrieved* @return The property’s value** @exception IllegalArgumentException if there is no property* of the specified name*/public Object get(String name) { // Return any non-null value for the specified propertyObject value = values.get(name); if (value != null) { return (value);} // Return a null value for a non-primitive propertyClass<?> type = getDynaProperty(name).getType(); if (!type.isPrimitive()) { return(value);} // Manufacture default values for primitive propertiesif (type == Boolean.TYPE) { return (Boolean.FALSE);} else if (type == Byte.TYPE) { return (new Byte((byte) 0));} else if (type == Character.TYPE) { return (new Character((char) 0));} else if (type == Double.TYPE) { return (new Double(0.0));} else if (type == Float.TYPE) { return (new Float((float) 0.0));} else if (type == Integer.TYPE) { return (new Integer(0));} else if (type == Long.TYPE) { return (new Long(0));} else if (type == Short.TYPE) { return (new Short((short) 0));} else { return (null);}}

從以上代碼可以看出是在values里取值的

/*** The set of property values for this DynaBean, keyed by property name.*/protected HashMap<String, Object> values = new HashMap<String, Object>();

其實是用HashMap來實現的.

3.總結

用cglib動態刪除添加屬性時,雖然obj里有getUsername這個方法,卻不能obj.getUsername()這樣直接調用,想得到username的值只能通過beanMap.get('username')獲取.

org.apache.commons.beanutils從源碼來看是使用HashMap來實現的.

兩種方式從操作角度來說和使用Map的區別不大.只是它們都提供了復制屬性的工具方法.

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲国产精品av| 久久精品人人做人人爽电影蜜月| 亚洲国产第一| 久久久久久久久久久99999| 国产99一区视频免费| 91极品美女在线| 天天爽夜夜爽夜夜爽精品视频| 国产精品手机在线| 亚洲制服丝袜一区| 一区二区不卡在线视频 午夜欧美不卡'| 国产精品传媒在线| 欧美日韩p片| 中文字幕+乱码+中文字幕一区| www.亚洲人| 欧美成人video| 99视频超级精品| 国产情人综合久久777777| 99re66热这里只有精品3直播 | 亚洲黑丝一区二区| 中文字幕电影一区| 韩国在线一区| 17c精品麻豆一区二区免费| 亚洲人成免费| 亚洲综合激情网| 久久都是精品| 美美哒免费高清在线观看视频一区二区 | 欧美一区二区三区四区视频| 久久国产精品露脸对白| 欧美婷婷六月丁香综合色| 紧缚奴在线一区二区三区| 欧美一区二区在线视频| 成人小视频在线观看| 337p日本欧洲亚洲大胆精品| 欧美精品aa| 成人欧美一区二区三区1314| 国产手机视频一区二区| 午夜精品视频一区| 一本色道久久综合狠狠躁的推荐| 男女男精品视频| 欧美日韩高清在线| av一区二区三区| 亚洲少妇中出一区| 男人的天堂亚洲在线| 久久精品国产99国产| 日韩欧美电影在线| 欧美日韩一区二区国产| 综合久久久久久久| 久久九九国产| 国产一区二区看久久| 欧美成人精品高清在线播放 | 一本色道久久综合狠狠躁的推荐| 久久99久久99| 久久精品免视看| 亚洲经典一区| 日韩电影在线一区| 欧美一区二区视频网站| 午夜国产欧美理论在线播放 | 国产精品99久久久久久似苏梦涵| 日韩欧美黄色影院| 亚洲国产日韩欧美一区二区三区| 亚洲成人免费观看| 欧美疯狂性受xxxxx喷水图片| 91丝袜美腿高跟国产极品老师 | 欧美一区二区在线不卡| 欧美国产视频在线观看| 亚洲国产精品精华液网站| 欧美二区三区91| 欧美视频1区| 亚洲一区二区四区蜜桃| 91 com成人网| 精品不卡在线| 九九在线精品视频| 日本一区二区久久| 一本大道久久精品懂色aⅴ| 国产二区国产一区在线观看| 亚洲日本在线看| 欧美电影影音先锋| 影院欧美亚洲| 精品在线观看视频| 国产精品色在线观看| 91黄色免费看| 欧美精品尤物在线| 免费亚洲电影在线| 日本一区二区免费在线 | 欧美羞羞免费网站| 久久青草欧美一区二区三区| 久久黄色网页| a级精品国产片在线观看| 亚洲成在线观看| 久久综合九色综合欧美就去吻| 在线亚洲伦理| 成人综合婷婷国产精品久久| 日韩毛片高清在线播放| 欧美一区午夜精品| 国产精品久久久久久久免费软件| 国产一区二区三区精品视频| 自拍偷拍国产精品| 日韩区在线观看| 国产伦一区二区三区色一情| 国产ts人妖一区二区| 一区二区三区小说| 精品国精品自拍自在线| 亚洲一区二区三区色| 99久久99久久精品免费观看 | 亚洲一区二区在线看| 欧美精品国产精品| 亚洲精品午夜久久久| 亚洲风情在线资源站| 亚洲日本青草视频在线怡红院 | 国产精品日日摸夜夜摸av| 一区二区三区精品视频在线| 国产亚洲精品aa午夜观看| 亚洲自拍另类综合| 国产成人av自拍| 91理论电影在线观看| 看电视剧不卡顿的网站| 成人一区二区三区在线观看 | 色欧美片视频在线观看| 欧美精品系列| 精品一区二区三区免费| 成人欧美一区二区三区视频网页| 69精品人人人人| 色婷婷久久久亚洲一区二区三区| 欧美午夜不卡| 成人av网址在线观看| 日韩国产一区二| 国产精品区一区二区三| 精品入口麻豆88视频| 精品视频1区2区| 国产精品一区视频网站| 国产精品v欧美精品v日本精品动漫 | 欧美三级欧美一级| 国产视频在线观看一区| 欧美在线黄色| 国产一区二区三区免费看| 亚洲成人免费看| 一区二区三区中文字幕精品精品 | 亚洲国产欧美日韩| av综合在线播放| 国产一区高清在线| 午夜精彩视频在线观看不卡| 国产精品入口麻豆九色| 2020国产精品久久精品美国| 91精品国产全国免费观看| 在线观看视频91| 欧美精品国产一区| 成人做爰69片免费看网站| 久久不见久久见中文字幕免费| 亚洲精品免费在线观看| 国产精品水嫩水嫩| 精品国产一区二区国模嫣然| 7777精品伊人久久久大香线蕉的| 欧美影院午夜播放| 久久婷婷影院| 国产精品久久九九| 一本色道88久久加勒比精品| 暖暖成人免费视频| av一区二区三区四区| 成人一区二区三区视频| 国产精品1区2区| 国产精品一区三区| 国产精选一区二区三区| 国产一区二区三区四| 国产麻豆视频一区| 九色综合国产一区二区三区| 美美哒免费高清在线观看视频一区二区 | 96av麻豆蜜桃一区二区| 成人午夜电影网站| 成人妖精视频yjsp地址| 国内精品自线一区二区三区视频| 青娱乐精品视频在线| 免费一级片91| 精品在线观看视频| 国产在线视视频有精品| 国产乱一区二区| 高清国产一区二区| thepron国产精品| 成人av片在线观看| 99久久精品99国产精品| 欧美成人久久| 91片黄在线观看| 亚洲欧美一区二区原创| 欧美精品99| 亚洲人体大胆视频| 99精品国产在热久久| 亚洲一区二区三区免费观看| 国产精品试看| 久久久久看片| 欧美日韩综合在线| 欧美一级二级在线观看| 欧洲av一区二区嗯嗯嗯啊| 欧美中文字幕亚洲一区二区va在线| 欧美日韩免费视频| 日韩免费成人网| 久久久久久久久久久久久夜| 欧美国产成人在线| 综合激情成人伊人| 亚洲一区二区三区四区五区黄| 日韩有码一区二区三区| 天天操天天色综合|