例如一个对象里面有10个字段,都要转成键值对形式上传给后台,这就需要不断的map.put(key,value); 这时候就需要封装一个反射类,通过反射来完成这个繁琐的操作
package www.lvchehui.com.carteam.tools.provider; import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import www.lvchehui.com.carteam.tools.ReflectionUtil; /* *创建者: LJW *创建时间:2020/9/3 16:35 *描述: 对象转map工具类 */ public class ReflectionToMapUtil { private static final String TAG = ReflectionUtil.class.getSimpleName(); @NonNull public static HashMap<String, String> getStringMap(Object object) { HashMap<String, String> map = new HashMap<>(); HashMap<String, Object> objectMap = getObjectMap(object); if (objectMap.size() > 0) { for (Map.Entry<String, Object> entry : objectMap.entrySet()) { if (entry.getValue() != null) { map.put(entry.getKey(), String.valueOf(entry.getValue())); } } objectMap.clear(); } return map; } /** * 通过反射获取实体成员变量名作键,成员变量值作值的 map * 1、不包括父类的实例域 * 2、可提取的成员变量类型包括 String,Integer,Double,Long,Boolean,其他类型暂不作提取 * 3、成员变量名首字母大写再加上 "get" 前缀即为对应的 getter 方法,不匹配会导致反射方法调用失败 * * @param object 任意对象 * @return map */ @NonNull private static HashMap<String, Object> getObjectMap(Object object) { HashMap<String, Object> map = new HashMap<>(); if (object == null) { return map; } // 获取所有实例域(成员变量),public 和 protected 和 private,但是不包括父类的实例域 Field[] fields = object.getClass().getDeclaredFields();//获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。 if (fields.length == 0) { return map; } String[] fieldNames = new String[fields.length]; String[] fieldTypes = new String[fields.length]; for (int i = 0; i < fields.length; i++) { fieldNames[i] = fields[i].getName();//变量的名 fieldTypes[i] = fields[i].getGenericType().toString();// 返回属性声名的Type类型 如 class java.lang.String // 访问 private 属性 fields[i].setAccessible(true); String fieldType = fieldTypes[i]; String fieldName = fieldNames[i]; String methodName = fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase());//将属性的第一个字母大写 try { // 使用 getter 方法获取属性值,即 get + 成员变量首字母大写 Method method = object.getClass().getMethod("get" + methodName);//获取get***方法 // 如果 fieldType 是类类型,则前面包含"class ",后面跟类名 if (fieldType.equals("class " + String.class.getName())) { // 提取 String 类型 String fieldValueString = (String) method.invoke(object); if (!TextUtils.isEmpty(fieldValueString)) { map.put(fieldName, fieldValueString); } else { Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value isEmpty"); } } else if (fieldType.equals("class " + Integer.class.getName())) { // 提取 Integer 类型 Integer fieldValueInteger = (Integer) method.invoke(object); if (fieldValueInteger != null) { map.put(fieldName, fieldValueInteger); } else { Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value == null"); } } else if (fieldType.equals("class " + Double.class.getName())) { // 提取 Double 类型 Double fieldValueDouble = (Double) method.invoke(object); if (fieldValueDouble != null) { map.put(fieldName, fieldValueDouble); } else { Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value == null"); } } else if (fieldType.equals("class " + Long.class.getName())) { // 提取 Long 类型 Long fieldValueLong = (Long) method.invoke(object); if (fieldValueLong != null) { map.put(fieldName, fieldValueLong); } else { Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value == null"); } } else if (fieldType.equals("class " + Boolean.class.getName())) { // 提取 Boolean 类型 Boolean fieldValueBoolean = (Boolean) method.invoke(object); if (fieldValueBoolean != null) { map.put(fieldName, fieldValueBoolean); } else { Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value == null"); } } else { // 未提取类型 Log.e(TAG,"Type: " + fieldType + ", Name = " + fieldName + ", Value 未提取"); } } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } Log.e(TAG, "getObjectMap: " + map); return map; } }这个工具类的使用步骤: 1.把需要上传给服务器的字段写着一个类里面。 2.该类里面的所有属性都要有set,get方法。(通过get方法获得map的value值的) 3. HashMap<String, String> map = ReflectionToMapUtil .getStringMap(Object); 由于公司项目比较小,如果项目较大不建议使用,毕竟反射耗性能。 完工哈哈