日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:32日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产91欧美| caoporn视频在线| 在线天堂资源www在线污| 国产91欧美| 播放一区二区| 亚洲欧洲一区二区天堂久久| 一区在线免费| 亚洲精品乱码久久久久久蜜桃麻豆| 日本在线不卡视频一二三区| 国产亚洲精品精品国产亚洲综合| 欧美精品aa| 中文字幕在线视频久| 今天的高清视频免费播放成人| 成人av二区| 日韩av在线免费观看不卡| 青草综合视频| 精品香蕉视频| 亚洲男女av一区二区| 日本不卡视频一二三区| 国产精品毛片久久| 丝袜美腿一区二区三区| 欧美国产极品| 国产视频亚洲| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 久久久久久久欧美精品| 四虎成人av| 老牛影视一区二区三区| 国产精品成人**免费视频 | 色天使综合视频| 亚洲三级av| 在线天堂中文资源最新版| 麻豆精品网站| 亚洲伊人av| 日韩在线黄色| 国户精品久久久久久久久久久不卡| 日韩亚洲精品在线观看| 国产乱码午夜在线视频| 亚洲三级精品| 久久国产中文字幕| 国产精品主播| 鲁大师影院一区二区三区| 日本激情一区| 亚洲麻豆一区| 激情自拍一区| аⅴ资源天堂资源库在线| 日本午夜免费一区二区| 国产综合婷婷| 国产中文在线播放| 国产无遮挡裸体免费久久 | 亚洲精品小说| 久久亚洲黄色| 日本亚洲欧美天堂免费| 99在线观看免费视频精品观看| 久久女人天堂| 91在线成人| 蜜臀av性久久久久蜜臀aⅴ四虎 | 老司机免费视频一区二区| 石原莉奈在线亚洲二区| 色婷婷精品视频| 粉嫩av一区二区三区四区五区| 亚洲精品国产日韩| 极品日韩av| 日韩一区二区三区在线免费观看| 日本不卡在线视频| 亚洲一区日韩在线| 国产精品av久久久久久麻豆网| 国产成人调教视频在线观看| 日韩美女国产精品| 丝袜国产日韩另类美女| 日韩精品一区二区三区免费观看| 欧美激情网址| 国产精品一线| 日韩av电影一区| 亚洲深深色噜噜狠狠爱网站 | 黄色日韩在线| 久久免费黄色| 亲子伦视频一区二区三区| 国产一区二区三区不卡av| 欧美激情福利| 国产激情综合| 麻豆精品视频在线观看视频| 911精品国产| 日韩成人av影视| 日韩精品国产精品| 日韩午夜视频在线| 日韩激情一二三区| 日韩在线观看中文字幕| 日韩专区一卡二卡| 中文一区一区三区免费在线观 | 麻豆精品蜜桃视频网站| 日本免费在线视频不卡一不卡二| 天堂成人免费av电影一区| 伊人久久亚洲热| 欧美日韩国产综合网| 国产视频亚洲| 婷婷成人av| 国产伦一区二区三区| 欧美激情三区| 日韩一区二区在线免费| 99久久99久久精品国产片果冰| 亚洲午夜精品久久久久久app| 亚洲国内精品| 免费在线视频一区| 中文字幕日本一区二区| 综合亚洲自拍| 日韩精品成人在线观看| 日韩欧美2区| 国产欧美日韩精品一区二区三区| 国产精品欧美一区二区三区不卡 | 国产欧美日韩免费观看| 美女国产精品久久久| 久久毛片亚洲| 亚洲激情偷拍| 蜜臀久久99精品久久久久宅男| 日韩一区二区三区免费视频| 国产精品久av福利在线观看| 成人高清一区| 极品日韩av| 天堂久久一区| 欧美激情在线精品一区二区三区| 精品国产亚洲一区二区三区| 欧美男人天堂| 美女尤物久久精品| 日韩美女精品| 不卡福利视频| 热久久免费视频| 精品日本视频| 国产亚洲一区在线| 久久国产尿小便嘘嘘| 青青青免费在线视频| 99国产精品自拍| 国产日韩视频在线| 91tv亚洲精品香蕉国产一区| 日本 国产 欧美色综合| 欧美一区自拍| 久久久久99| 日韩av一级片| 久久久成人网| 欧美亚洲一区二区三区| 日韩在线免费| 日韩精品乱码av一区二区| 中文一区一区三区高中清不卡免费| 亚洲欧美日韩专区| 国产精品美女久久久久久不卡| 久久中文亚洲字幕| 日本欧美韩国一区三区| 亚洲va在线| 国产精品一级| 亚洲欧美日韩国产| 精品视频一区二区三区在线观看| 99国产精品| 精品国产成人| 蜜臀a∨国产成人精品| 福利视频一区| 亚洲九九精品| 三上悠亚国产精品一区二区三区| 深夜福利一区| 狠狠操综合网| 黄色欧美在线| 日韩高清一区| 国产综合色产| 精品久久网站| 日韩黄色免费网站| 亚洲激情精品| 黑森林国产精品av| 欧美永久精品| 午夜在线视频观看日韩17c| av最新在线| 久久99影视| 无码日韩精品一区二区免费| 久久在线免费| 亚洲精品**中文毛片| 国产美女亚洲精品7777| 免费不卡在线观看| 黄色亚洲在线| 蜜桃视频在线网站| 美女视频黄 久久| 欧美日本三区| 中文字幕av一区二区三区四区| 日韩精品欧美| 风间由美中文字幕在线看视频国产欧美| 日韩精品视频网站| 亚洲精品第一| 一区二区三区网站| 亚洲免费影院| 亚洲一区中文| 亚洲夜间福利| 日韩精品欧美激情一区二区| 韩国久久久久久| av资源中文在线| 成年男女免费视频网站不卡| 久久久国产精品网站| 国产精品美女在线观看直播| 欧美日韩亚洲一区二区三区在线| 视频一区二区三区中文字幕| 99在线精品免费视频九九视 | 精品国产亚洲一区二区三区在线| 国产精品一页| 欧美精品二区| 国产中文字幕一区二区三区|