Some pits of Object to Map

Here, three methods of Object mapping are summarized 1. Use reflection getDeclaredFields and getFields /** * Clean the data of the incoming object, re...
1. Use reflection getDeclaredFields and getFields
2. Through apache's Utils
3. Through the PropertyDescriptor class of jdk

Here, three methods of Object mapping are summarized

1. Use reflection getDeclaredFields and getFields

/** * Clean the data of the incoming object, remove the null and '' property values, and store the other field names and property values in the map collection */ public Map<String,Object> objectToMap(Object requestParameters) throws IllegalAccessException { Map<String, Object> map = new HashMap<>(); // Get all property fields in the corresponding class of f object Field[] fields = requestParameters.getClass().getDeclaredFields(); for (int i = 0, len = fields.length; i < len; i++) { String varName = fields[i].getName(); // Get the original access control permission boolean accessFlag = fields[i].isAccessible(); // Modify access control permissions fields[i].setAccessible(true); // Get the variables in the object corresponding to the properties fields[i] in the object f Object o = fields[i].get(requestParameters); if (o != null && StringUtils.isNotBlank(o.toString().trim())) { map.put(varName, o.toString().trim()); // Restore access control rights fields[i].setAccessible(accessFlag); } } return map; }

Pit by reflection,

1. getDeclaredFields can only return the fields of the Object, not the fields of the parent class. If you don't pay attention, you will lose the properties; 2. If the getFields method is used, only public fields can be returned, not privite private ones

2. Through apache's Utils

public static Map<?, ?> objectToMap(Object obj) { if (obj == null) { return null; } return new org.apache.commons.beanutils.BeanMap(obj); }

apache's Utils pit

The returned beanmap extensions abstractmap is not a HashMap. Please note that

3. Through the PropertyDescriptor class of jdk

public static Map<String, Object> objectToMap(Object obj) throws Exception { if(obj == null) return null; Map<String, Object> map = new HashMap<String, Object>(); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors) { String key = property.getName(); if (key.compareToIgnoreCase("class") == 0) { continue; } Method getter = property.getReadMethod(); Object value = getter!=null ? getter.invoke(obj) : null; map.put(key, value); } return map; }

The propertydescriptors of the jdk are used here. Note that the getPropertyDescriptors method gets all fields. The first one is the class of the class. Note to judge

java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()]

3 December 2019, 00:12 | Views: 2429

Add new comment

For adding a comment, please log in
or create account

0 comments