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 ones2. 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()]