Java bean 与 Map的相互转换

    xiaoxiao2021-03-25  65

    /** * 将bean转化为map * 注意: * 1. Bean必须实现getter和setter方法 * 2. 请避开CLASS_TYPE属性命名 * * @param obj * @return */ @SneakyThrows public static Map<String, Object> bean2Map(@NonNull Object obj) { Map<String, Object> res = new HashMap<>(); res.put(CLASS_TYPE, obj.getClass()); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors) { String propertyName = property.getName(); if (!"class".equals(propertyName)) { Method getter = property.getReadMethod(); getter.setAccessible(true); Object propertyValue = getter.invoke(obj); if (propertyValue == null || isWrapClass(propertyValue) || propertyValue instanceof String || propertyValue instanceof Number || propertyValue instanceof Boolean || propertyValue instanceof Character) { res.put(propertyName, propertyValue); } else { res.put(propertyName, bean2Map(propertyValue)); } } } return res; } /** * 将map转化为bean * 注意: * 1. 实现getter和setter方法 * 2. 多级结构保证CLASS_TYPE字段,以及其无参构造函数 * * @param map * @return */ @SneakyThrows public static Object map2Bean(@NonNull Map<String, Object> map) { if (map.containsKey(CLASS_TYPE)) { Class type = (Class) map.get(CLASS_TYPE); Object obj = type.newInstance(); for (Map.Entry<String, Object> entry : map.entrySet()) { String propertyName = entry.getKey(); if (!CLASS_TYPE.equals(propertyName)) { Object propertyValue = entry.getValue(); if (propertyValue == null) { setFieldValue(obj, propertyName, propertyValue); } else if (propertyValue instanceof Map) { setFieldValue(obj, propertyName, map2Bean((Map<String, Object>) propertyValue)); } else { setFieldValue(obj, propertyName, propertyValue); } } } return obj; } return map; }

    结果展示:

    {b={i=1, j=null, CLASS_TYPE=class org.kelab.swustoj.model.B}, c={k=2, l=sda, CLASS_TYPE=class org.kelab.swustoj.model.C}, CLASS_TYPE=class org.kelab.swustoj.model.A} A(b=B(i=1, j=null), c=C(k=2, l=sda))

    相关方法:

    /** * 判断是否基本类型:不包括String * * @param obj * @return */ public static boolean isWrapClass(@NonNull Object obj) { try { return ((Class) obj.getClass().getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } } /** * 利用反射设置属性值 * (1)getDeclaredFields()返回Class中所有的字段,包括私有字段; * (2)getFields 只返回公共字段,即有public修饰的字段 * Object value 可为空 * * @param obj * @param fieldName * @param value */ @SneakyThrows public static void setFieldValue(@NonNull Object obj, @NonNull String fieldName, Object value) { Class baseClazz = obj.getClass(); for (; !baseClazz.equals(Object.class); baseClazz = baseClazz.getSuperclass()) { try { PropertyDescriptor pd = new PropertyDescriptor(fieldName, baseClazz); Method method = pd.getWriteMethod(); if (!Modifier.isPublic(method.getModifiers())) { //设置非共有类属性权限 method.setAccessible(true); } method.invoke(obj, value); } catch (Exception e) { Field targetField = baseClazz.getDeclaredField(fieldName); if (!Modifier.isPublic(targetField.getModifiers())) { //设置非共有类属性权限 targetField.setAccessible(true); } targetField.set(obj, value); //设置类属性值 // 异常直接抛出 } } } /** * 利用反射获取属性值 * * @param obj * @param fieldName */ @SneakyThrows public static <T> T getFieldValue(@NonNull Object obj, @NonNull String fieldName, @NonNull Class<T> clazz) { T res = null; Class baseClazz = obj.getClass(); for (; res == null && !baseClazz.equals(Object.class); baseClazz = baseClazz.getSuperclass()) { try { PropertyDescriptor pd = new PropertyDescriptor(fieldName, baseClazz); Method method = pd.getReadMethod(); if (!Modifier.isPublic(method.getModifiers())) { //设置非共有类属性权限 method.setAccessible(true); } res = (T) method.invoke(obj); } catch (Exception e) { Field targetField = null; targetField = baseClazz.getDeclaredField(fieldName); if (!Modifier.isPublic(targetField.getModifiers())) { //设置非共有类属性权限 targetField.setAccessible(true); } res = (T) targetField.get(obj); //设置类属性值 // 在此抛出异常会直接抛出 } } return res; }
    转载请注明原文地址: https://ju.6miu.com/read-19057.html

    最新回复(0)