一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java cglib為實體類(javabean)動態(tài)添加屬性方式

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

2021-08-09 11:51writeanewworld Java教程

這篇文章主要介紹了Java cglib為實體類(javabean)動態(tài)添加屬性方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1.應用場景

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

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

2.引入依賴

  1. <!--使用cglib 為javabean動態(tài)添加屬性-->
  2. <dependency>
  3. <groupId>commons-beanutils</groupId>
  4. <artifactId>commons-beanutils</artifactId>
  5. <version>1.9.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>cglib</groupId>
  9. <artifactId>cglib-nodep</artifactId>
  10. <version>3.2.4</version>
  11. </dependency>

3.代碼如下

  1. import com.freemud.waimai.menu.dpzhcto.dto.DynamicBean;
  2. import com.google.common.collect.Maps;
  3. import org.apache.commons.beanutils.PropertyUtilsBean;
  4. import java.beans.PropertyDescriptor;
  5. import java.util.Map;
  6. public class PicBeanAddPropertiesUtil {
  7. public static Object getTarget(Object dest, Map<String, Object> addProperties) {
  8. // get property map
  9. PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
  10. PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
  11. Map<String, Class> propertyMap = Maps.newHashMap();
  12. for (PropertyDescriptor d : descriptors) {
  13. if (!"class".equalsIgnoreCase(d.getName())) {
  14. propertyMap.put(d.getName(), d.getPropertyType());
  15. }
  16. }
  17. // add extra properties
  18. addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
  19. // new dynamic bean
  20. DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
  21. // add old value
  22. propertyMap.forEach((k, v) -> {
  23. try {
  24. // filter extra properties
  25. if (!addProperties.containsKey(k)) {
  26. dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k));
  27. }
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. });
  32. // add extra value
  33. addProperties.forEach((k, v) -> {
  34. try {
  35. dynamicBean.setValue(k, v);
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. });
  40. Object target = dynamicBean.getTarget();
  41. return target;
  42. }
  43. }
  1. import net.sf.cglib.beans.BeanGenerator;
  2. import net.sf.cglib.beans.BeanMap;
  3. import java.util.Map;
  4. public class DynamicBean {
  5. /**
  6. * 目標對象
  7. */
  8. private Object target;
  9. /**
  10. * 屬性集合
  11. */
  12. private BeanMap beanMap;
  13. public DynamicBean(Class superclass, Map<String, Class> propertyMap) {
  14. this.target = generateBean(superclass, propertyMap);
  15. this.beanMap = BeanMap.create(this.target);
  16. }
  17. /**
  18. * bean 添加屬性和值
  19. *
  20. * @param property
  21. * @param value
  22. */
  23. public void setValue(String property, Object value) {
  24. beanMap.put(property, value);
  25. }
  26. /**
  27. * 獲取屬性值
  28. *
  29. * @param property
  30. * @return
  31. */
  32. public Object getValue(String property) {
  33. return beanMap.get(property);
  34. }
  35. /**
  36. * 獲取對象
  37. *
  38. * @return
  39. */
  40. public Object getTarget() {
  41. return this.target;
  42. }
  43. /**
  44. * 根據(jù)屬性生成對象
  45. *
  46. * @param superclass
  47. * @param propertyMap
  48. * @return
  49. */
  50. private Object generateBean(Class superclass, Map<String, Class> propertyMap) {
  51. BeanGenerator generator = new BeanGenerator();
  52. if (null != superclass) {
  53. generator.setSuperclass(superclass);
  54. }
  55. BeanGenerator.addProperties(generator, propertyMap);
  56. return generator.create();
  57. }
  58. }
  59. public static void main(String[] args) {
  60. FinalPicBaseReqDto entity = new FinalPicBaseReqDto();
  61. entity.setAppKey("eee");
  62. entity.setContent("222");
  63. Map<String, Object> addProperties = new HashMap() {{
  64. put("動態(tài)屬性名", "動態(tài)屬性值");
  65. }};
  66. FinalPicBaseReqDto finalPicBaseReqVo = (FinalPicBaseReqDto) PicBeanAddPropertiesUtil.getTarget(entity, addProperties);
  67. System.out.println(JSON.toJSONString(finalPicBaseReqVo));
  68. }

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

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

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

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

補充:JavaBean動態(tài)添加刪除屬性

1.cglib

  1. BeanGenerator beanGenerator = new BeanGenerator();
  2. beanGenerator.addProperty("id", Long.class);
  3. beanGenerator.addProperty("username", String.class);
  4. Object obj = beanGenerator.create();
  5. BeanMap beanMap = BeanMap.create(obj);
  6. BeanCopier copier = BeanCopier.create(User.class, obj.getClass(), false);
  7. User user = new User();
  8. user.setId(1L);
  9. user.setUsername("name1");
  10. user.setPassword("123");
  11. copier.copy(user, obj, null);
  12. System.out.println(beanMap.get("username"));Class clazz = obj.getClass();
  13. Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {
  14. System.out.println(methods[i].getName());
  15. }

輸出結(jié)果:

  1. name1
  2. getId
  3. getUsername
  4. setId
  5. setUsername

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

2.org.apache.commons.beanutils

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

輸入結(jié)果:

  1. id:1username:name1

查看BasicDynaBean與BasicDynaClass之間的關系

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

DynaBean的源碼

  1. public interface DynaBean {
  2. public boolean contains(String name, String key);
  3. public Object get(String name);
  4. public Object get(String name, int index);
  5. public Object get(String name, String key);
  6. public DynaClass getDynaClass();
  7. public void remove(String name, String key);
  8. public void set(String name, Object value);
  9. public void set(String name, int index, Object value);
  10. public void set(String name, String key, Object value);
  11. }

主要是接口的定義

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

  1. /**
  2. * Return the value of a simple property with the specified name.
  3. *
  4. * @param name Name of the property whose value is to be retrieved
  5. * @return The property's value
  6. *
  7. * @exception IllegalArgumentException if there is no property
  8. * of the specified name
  9. */public Object get(String name) { // Return any non-null value for the specified property
  10. Object value = values.get(name); if (value != null) { return (value);
  11. } // Return a null value for a non-primitive property
  12. Class<?> type = getDynaProperty(name).getType(); if (!type.isPrimitive()) { return(value);
  13. } // Manufacture default values for primitive properties
  14. if (type == Boolean.TYPE) { return (Boolean.FALSE);
  15. } else if (type == Byte.TYPE) { return (new Byte((byte) 0));
  16. } else if (type == Character.TYPE) { return (new Character((char) 0));
  17. } else if (type == Double.TYPE) { return (new Double(0.0));
  18. } else if (type == Float.TYPE) { return (new Float((float) 0.0));
  19. } else if (type == Integer.TYPE) { return (new Integer(0));
  20. } else if (type == Long.TYPE) { return (new Long(0));
  21. } else if (type == Short.TYPE) { return (new Short((short) 0));
  22. } else { return (null);
  23. }
  24. }

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

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

其實是用HashMap來實現(xiàn)的.

3.總結(jié)

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

org.apache.commons.beanutils從源碼來看是使用HashMap來實現(xiàn)的.

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

原文鏈接:https://www.jianshu.com/p/cc1014e71e8a

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99re视频精品全部免费 | sese在线观看 | 糖心在线观看网 | 亚州男人天堂 | 日韩人成 | 日本www视频在线观看 | 欧美操大逼视频 | 超级乱淫伦小说1女多男 | 欧美日韩亚洲另类人人澡 | 欧美又硬又粗又长又大 | 亚洲精品高清中文字幕完整版 | 丁香五香天堂网 | 五月天综合久久 | 欧美一区二区三区精品 | 亚洲欧美久久婷婷爱综合一区天堂 | 俄罗斯12一15处交 | 80s在线| 国产趴着打光屁股sp抽打 | 免费亚洲成人 | 校花在公车上被内射好舒服 | 成人国产一区二区 | 91传媒制片厂果冻有限公司 | 国产人人艹 | 国产精品原创视频 | 人妖欧美一区二区三区四区 | 暖暖 免费 高清 日本 中文 | 我和子伦系列小说 | 动漫人物差差差动漫人物免费观看 | 精品国产福利在线观看一区 | 好爽好紧小雪别夹小说 | 清清草在线视频 | 欧美日韩国产成人综合在线 | 国产剧情在线播放 | 91精品国产麻豆国产自产在线 | jj视频免费看 | 亚洲精品一二三四区 | 男女视频在线观看网站 | 国产一卡2卡3卡4卡公司科普 | 污网站免费观看在线高清 | 欧美黑人一级 | 精品亚洲欧美中文字幕在线看 |