Commit 15acd796058ab8348996f6fda863ae37de5255c1
1 parent
b4ec3db9
Exists in
master
objectutil upgrade
Showing
2 changed files
with
256 additions
and
187 deletions
Show diff stats
build.gradle
| @@ -62,7 +62,7 @@ uploadArchives { | @@ -62,7 +62,7 @@ uploadArchives { | ||
| 62 | authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) | 62 | authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) |
| 63 | } | 63 | } |
| 64 | pom.project { | 64 | pom.project { |
| 65 | - version '1.1.122' | 65 | + version '1.1.124' |
| 66 | artifactId ARTIFACT_Id | 66 | artifactId ARTIFACT_Id |
| 67 | groupId GROUP_ID | 67 | groupId GROUP_ID |
| 68 | packaging TYPE | 68 | packaging TYPE |
src/main/java/com/taover/util/UtilObject.java
| @@ -3,6 +3,8 @@ package com.taover.util; | @@ -3,6 +3,8 @@ package com.taover.util; | ||
| 3 | import java.lang.reflect.Field; | 3 | import java.lang.reflect.Field; |
| 4 | import java.lang.reflect.Modifier; | 4 | import java.lang.reflect.Modifier; |
| 5 | import java.util.ArrayList; | 5 | import java.util.ArrayList; |
| 6 | +import java.util.Arrays; | ||
| 7 | +import java.util.HashMap; | ||
| 6 | import java.util.Iterator; | 8 | import java.util.Iterator; |
| 7 | import java.util.List; | 9 | import java.util.List; |
| 8 | import java.util.Map; | 10 | import java.util.Map; |
| @@ -11,376 +13,443 @@ public class UtilObject { | @@ -11,376 +13,443 @@ public class UtilObject { | ||
| 11 | /** | 13 | /** |
| 12 | * 将源对象source字段赋值到对象dest字段,条件1字段名相同,条件2字段类型相同; | 14 | * 将源对象source字段赋值到对象dest字段,条件1字段名相同,条件2字段类型相同; |
| 13 | * 注:source与dest可以是两个没有关系的类,不接受基本封装类型,例如Integer | 15 | * 注:source与dest可以是两个没有关系的类,不接受基本封装类型,例如Integer |
| 16 | + * | ||
| 14 | * @param source | 17 | * @param source |
| 15 | * @param dest | 18 | * @param dest |
| 16 | * @param allowNull | 19 | * @param allowNull |
| 17 | * @param exceptFieldNameArray | 20 | * @param exceptFieldNameArray |
| 18 | * @return 如果source==dest或者source==null或者dest==null,则返回false | 21 | * @return 如果source==dest或者source==null或者dest==null,则返回false |
| 19 | */ | 22 | */ |
| 20 | - public static Object fieldCopy(Object source, Object dest, boolean allowNull, String exceptFieldNameArray[], boolean isNewInstance){ | ||
| 21 | - //引用检查 | ||
| 22 | - if(source==null || dest==null || source==dest){ | 23 | + public static Object fieldCopy(Object source, Object dest, boolean allowNull, String exceptFieldNameArray[], |
| 24 | + boolean isNewInstance) { | ||
| 25 | + // 引用检查 | ||
| 26 | + if (source == null || dest == null || source == dest) { | ||
| 23 | return null; | 27 | return null; |
| 24 | } | 28 | } |
| 25 | - | ||
| 26 | - //获取Field数组 | ||
| 27 | - Field[] sourceField = source.getClass().getDeclaredFields(); | ||
| 28 | - Field[] destField = dest.getClass().getDeclaredFields(); | ||
| 29 | - | ||
| 30 | - //获取目标对象 | 29 | + |
| 30 | + // 获取Field数组 | ||
| 31 | + Field[] sourceField = getAndCachedFields(source.getClass()); | ||
| 32 | + Field[] destField = getAndCachedFields(dest.getClass()); | ||
| 33 | + | ||
| 34 | + // 获取目标对象 | ||
| 31 | String[] destFieldNameArray = new String[destField.length]; | 35 | String[] destFieldNameArray = new String[destField.length]; |
| 32 | String[] destFieldTypeArray = new String[destField.length]; | 36 | String[] destFieldTypeArray = new String[destField.length]; |
| 33 | - for(int i=0; i<destField.length; ++i){ | 37 | + for (int i = 0; i < destField.length; ++i) { |
| 34 | destFieldNameArray[i] = destField[i].getName(); | 38 | destFieldNameArray[i] = destField[i].getName(); |
| 35 | destFieldTypeArray[i] = destField[i].getType().getName(); | 39 | destFieldTypeArray[i] = destField[i].getType().getName(); |
| 36 | } | 40 | } |
| 37 | - | 41 | + |
| 38 | Object newDest = null; | 42 | Object newDest = null; |
| 39 | - //注入属性 | ||
| 40 | - if(isNewInstance){ | 43 | + // 注入属性 |
| 44 | + if (isNewInstance) { | ||
| 41 | try { | 45 | try { |
| 42 | newDest = dest.getClass().newInstance(); | 46 | newDest = dest.getClass().newInstance(); |
| 43 | - for(int i=0; i<destField.length; ++i){ | 47 | + for (int i = 0; i < destField.length; ++i) { |
| 44 | destField[i].setAccessible(true); | 48 | destField[i].setAccessible(true); |
| 45 | Object tempValue = destField[i].get(dest); | 49 | Object tempValue = destField[i].get(dest); |
| 46 | destField[i].set(newDest, tempValue); | 50 | destField[i].set(newDest, tempValue); |
| 47 | } | 51 | } |
| 48 | - } catch (Exception e2) { } | 52 | + } catch (Exception e2) { |
| 53 | + } | ||
| 49 | } | 54 | } |
| 50 | - | ||
| 51 | - //遍历源field数组,处理源field数组 | ||
| 52 | - for(int i=0; i<sourceField.length; ++i){ | ||
| 53 | - //获取源field相关信息 | 55 | + |
| 56 | + // 遍历源field数组,处理源field数组 | ||
| 57 | + for (int i = 0; i < sourceField.length; ++i) { | ||
| 58 | + // 获取源field相关信息 | ||
| 54 | Object sourceFieldValue = null; | 59 | Object sourceFieldValue = null; |
| 55 | String sourceFieldName = sourceField[i].getName(); | 60 | String sourceFieldName = sourceField[i].getName(); |
| 56 | String sourceFieldType = sourceField[i].getType().getName(); | 61 | String sourceFieldType = sourceField[i].getType().getName(); |
| 57 | - | ||
| 58 | - //获取sourceFieldValue值 | 62 | + |
| 63 | + // 获取sourceFieldValue值 | ||
| 59 | sourceField[i].setAccessible(true); | 64 | sourceField[i].setAccessible(true); |
| 60 | try { | 65 | try { |
| 61 | sourceFieldValue = sourceField[i].get(source); | 66 | sourceFieldValue = sourceField[i].get(source); |
| 62 | - } catch (Exception e1) { } | ||
| 63 | - | ||
| 64 | - //检查是否在exceptFieldName中 | ||
| 65 | - if(-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)){ | 67 | + } catch (Exception e1) { |
| 68 | + } | ||
| 69 | + | ||
| 70 | + // 检查是否在exceptFieldName中 | ||
| 71 | + if (-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)) { | ||
| 66 | continue; | 72 | continue; |
| 67 | } | 73 | } |
| 68 | - | ||
| 69 | - //检验sourceFieldValue是否为NULL | ||
| 70 | - if(!allowNull && sourceFieldValue == null){ | 74 | + |
| 75 | + // 检验sourceFieldValue是否为NULL | ||
| 76 | + if (!allowNull && sourceFieldValue == null) { | ||
| 71 | continue; | 77 | continue; |
| 72 | } | 78 | } |
| 73 | - | ||
| 74 | - //检查源field字段名是否在目标field组中存在 | 79 | + |
| 80 | + // 检查源field字段名是否在目标field组中存在 | ||
| 75 | int nameIndex = UtilString.getStringIndex(sourceFieldName, destFieldNameArray); | 81 | int nameIndex = UtilString.getStringIndex(sourceFieldName, destFieldNameArray); |
| 76 | - if(nameIndex == -1){ | 82 | + if (nameIndex == -1) { |
| 77 | continue; | 83 | continue; |
| 78 | - }else{ | ||
| 79 | - //如果是final关键词修饰,则返回 | ||
| 80 | - if(Modifier.isFinal(destField[nameIndex].getModifiers())){ | 84 | + } else { |
| 85 | + // 如果是final关键词修饰,则返回 | ||
| 86 | + if (Modifier.isFinal(destField[nameIndex].getModifiers())) { | ||
| 81 | continue; | 87 | continue; |
| 82 | } | 88 | } |
| 83 | - | ||
| 84 | - //如果源field与目标field数据类型相同,则将sourceFieldValue赋值给目标对象 | ||
| 85 | - if(sourceFieldType.equals(destFieldTypeArray[nameIndex])){ | 89 | + |
| 90 | + // 如果源field与目标field数据类型相同,则将sourceFieldValue赋值给目标对象 | ||
| 91 | + if (sourceFieldType.equals(destFieldTypeArray[nameIndex])) { | ||
| 86 | destField[nameIndex].setAccessible(true); | 92 | destField[nameIndex].setAccessible(true); |
| 87 | try { | 93 | try { |
| 88 | destField[nameIndex].set(dest, sourceFieldValue); | 94 | destField[nameIndex].set(dest, sourceFieldValue); |
| 89 | - if(isNewInstance){ | ||
| 90 | - destField[nameIndex].set(newDest, sourceFieldValue); | 95 | + if (isNewInstance) { |
| 96 | + destField[nameIndex].set(newDest, sourceFieldValue); | ||
| 91 | } | 97 | } |
| 92 | - } catch (Exception e) { } | 98 | + } catch (Exception e) { |
| 99 | + } | ||
| 93 | } | 100 | } |
| 94 | } | 101 | } |
| 95 | } | 102 | } |
| 96 | - | 103 | + |
| 97 | return newDest; | 104 | return newDest; |
| 98 | } | 105 | } |
| 99 | - | 106 | + |
| 107 | + private static Map<String, Field[]> cachedField = new HashMap<String, Field[]>(); | ||
| 108 | + | ||
| 109 | + private static Field[] getAndCachedFields(Class<? extends Object> infoClass) { | ||
| 110 | + String infoClassName = infoClass.getName(); | ||
| 111 | + if (cachedField.containsKey(infoClassName)) { | ||
| 112 | + return cachedField.get(infoClassName); | ||
| 113 | + } else { | ||
| 114 | + List<Field> recurseField = new ArrayList<Field>(); | ||
| 115 | + loadClassFieldRecurse(infoClass, recurseField); | ||
| 116 | + Field[] data = new Field[recurseField.size()]; | ||
| 117 | + recurseField.toArray(data); | ||
| 118 | + cachedField.put(infoClassName, data); | ||
| 119 | + return data; | ||
| 120 | + } | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + private static void loadClassFieldRecurse(Class<? extends Object> infoClass, List<Field> recurseField) { | ||
| 124 | + // Object对象不处理 | ||
| 125 | + if ("java.lang.Object".equals(infoClass.getName())) { | ||
| 126 | + return; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + // 父类处理 | ||
| 130 | + Class parentClass = infoClass.getSuperclass(); | ||
| 131 | + if (parentClass != null || !"java.lang.Object".equals(parentClass.getName())) { | ||
| 132 | + loadClassFieldRecurse(parentClass, recurseField); | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + recurseField.addAll(Arrays.asList(infoClass.getDeclaredFields())); | ||
| 136 | + } | ||
| 137 | + | ||
| 100 | /** | 138 | /** |
| 101 | * 将源对象source字段赋值到对象dest字段,条件1字段名相同,条件2字段类型相同; | 139 | * 将源对象source字段赋值到对象dest字段,条件1字段名相同,条件2字段类型相同; |
| 102 | * 注:source与dest可以是两个没有关系的类,不接受基本封装类型,例如Integer | 140 | * 注:source与dest可以是两个没有关系的类,不接受基本封装类型,例如Integer |
| 141 | + * | ||
| 103 | * @param source | 142 | * @param source |
| 104 | * @param destClass | 143 | * @param destClass |
| 105 | * @param allowNull | 144 | * @param allowNull |
| 106 | * @param exceptFieldNameArray | 145 | * @param exceptFieldNameArray |
| 107 | * @return 如果source==null或者destClass==null,则返回false | 146 | * @return 如果source==null或者destClass==null,则返回false |
| 108 | */ | 147 | */ |
| 109 | - public static <E> E fieldCopy(Object source, Class<E> destClass, boolean allowNull, String exceptFieldNameArray[]) throws Exception{ | ||
| 110 | - //引用检查 | ||
| 111 | - if(source==null || destClass==null){ | 148 | + public static <E> E fieldCopy(Object source, Class<E> destClass, boolean allowNull, String exceptFieldNameArray[]) |
| 149 | + throws Exception { | ||
| 150 | + // 引用检查 | ||
| 151 | + if (source == null || destClass == null) { | ||
| 112 | return null; | 152 | return null; |
| 113 | } | 153 | } |
| 114 | - | ||
| 115 | - //获取Field数组 | ||
| 116 | - Field[] sourceField = source.getClass().getDeclaredFields(); | ||
| 117 | - Field[] destField = destClass.getDeclaredFields(); | ||
| 118 | - | ||
| 119 | - //获取目标对象 | 154 | + |
| 155 | + // 获取Field数组 | ||
| 156 | + Field[] sourceField = getAndCachedFields(source.getClass()); | ||
| 157 | + Field[] destField = getAndCachedFields(destClass); | ||
| 158 | + | ||
| 159 | + // 获取目标对象 | ||
| 120 | String[] destFieldNameArray = new String[destField.length]; | 160 | String[] destFieldNameArray = new String[destField.length]; |
| 121 | String[] destFieldTypeArray = new String[destField.length]; | 161 | String[] destFieldTypeArray = new String[destField.length]; |
| 122 | - for(int i=0; i<destField.length; ++i){ | 162 | + for (int i = 0; i < destField.length; ++i) { |
| 123 | destFieldNameArray[i] = destField[i].getName(); | 163 | destFieldNameArray[i] = destField[i].getName(); |
| 124 | destFieldTypeArray[i] = destField[i].getType().getName(); | 164 | destFieldTypeArray[i] = destField[i].getType().getName(); |
| 125 | } | 165 | } |
| 126 | - | 166 | + |
| 127 | E newDest = destClass.newInstance(); | 167 | E newDest = destClass.newInstance(); |
| 128 | - | ||
| 129 | - //遍历源field数组,处理源field数组 | ||
| 130 | - for(int i=0; i<sourceField.length; ++i){ | ||
| 131 | - //获取源field相关信息 | 168 | + |
| 169 | + // 遍历源field数组,处理源field数组 | ||
| 170 | + for (int i = 0; i < sourceField.length; ++i) { | ||
| 171 | + // 获取源field相关信息 | ||
| 132 | Object sourceFieldValue = null; | 172 | Object sourceFieldValue = null; |
| 133 | String sourceFieldName = sourceField[i].getName(); | 173 | String sourceFieldName = sourceField[i].getName(); |
| 134 | String sourceFieldType = sourceField[i].getType().getName(); | 174 | String sourceFieldType = sourceField[i].getType().getName(); |
| 135 | - | ||
| 136 | - //获取sourceFieldValue值 | 175 | + |
| 176 | + // 获取sourceFieldValue值 | ||
| 137 | sourceField[i].setAccessible(true); | 177 | sourceField[i].setAccessible(true); |
| 138 | try { | 178 | try { |
| 139 | sourceFieldValue = sourceField[i].get(source); | 179 | sourceFieldValue = sourceField[i].get(source); |
| 140 | - } catch (Exception e1) { } | ||
| 141 | - | ||
| 142 | - //检查是否在exceptFieldName中 | ||
| 143 | - if(-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)){ | 180 | + } catch (Exception e1) { |
| 181 | + } | ||
| 182 | + | ||
| 183 | + // 检查是否在exceptFieldName中 | ||
| 184 | + if (-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)) { | ||
| 144 | continue; | 185 | continue; |
| 145 | } | 186 | } |
| 146 | - | ||
| 147 | - //检验sourceFieldValue是否为NULL | ||
| 148 | - if(!allowNull && sourceFieldValue == null){ | 187 | + |
| 188 | + // 检验sourceFieldValue是否为NULL | ||
| 189 | + if (!allowNull && sourceFieldValue == null) { | ||
| 149 | continue; | 190 | continue; |
| 150 | } | 191 | } |
| 151 | - | ||
| 152 | - //检查源field字段名是否在目标field组中存在 | 192 | + |
| 193 | + // 检查源field字段名是否在目标field组中存在 | ||
| 153 | int nameIndex = UtilString.getStringIndex(sourceFieldName, destFieldNameArray); | 194 | int nameIndex = UtilString.getStringIndex(sourceFieldName, destFieldNameArray); |
| 154 | - if(nameIndex == -1){ | 195 | + if (nameIndex == -1) { |
| 155 | continue; | 196 | continue; |
| 156 | - }else{ | ||
| 157 | - //如果是final关键词修饰,则返回 | ||
| 158 | - if(Modifier.isFinal(destField[nameIndex].getModifiers())){ | 197 | + } else { |
| 198 | + // 如果是final关键词修饰,则返回 | ||
| 199 | + if (Modifier.isFinal(destField[nameIndex].getModifiers())) { | ||
| 159 | continue; | 200 | continue; |
| 160 | } | 201 | } |
| 161 | - | ||
| 162 | - //如果源field与目标field数据类型相同,则将sourceFieldValue赋值给目标对象 | ||
| 163 | - if(sourceFieldType.equals(destFieldTypeArray[nameIndex])){ | 202 | + |
| 203 | + // 如果源field与目标field数据类型相同,则将sourceFieldValue赋值给目标对象 | ||
| 204 | + if (sourceFieldType.equals(destFieldTypeArray[nameIndex])) { | ||
| 164 | destField[nameIndex].setAccessible(true); | 205 | destField[nameIndex].setAccessible(true); |
| 165 | try { | 206 | try { |
| 166 | destField[nameIndex].set(newDest, sourceFieldValue); | 207 | destField[nameIndex].set(newDest, sourceFieldValue); |
| 167 | - } catch (Exception e) { } | 208 | + } catch (Exception e) { |
| 209 | + } | ||
| 168 | } | 210 | } |
| 169 | } | 211 | } |
| 170 | } | 212 | } |
| 171 | - | 213 | + |
| 172 | return newDest; | 214 | return newDest; |
| 173 | } | 215 | } |
| 174 | - | 216 | + |
| 175 | /** | 217 | /** |
| 176 | * 将对象的所有属性转换到list数组中以objce数组存储,数组长度为2,第一个为属性名,第二个为属性值,如果对象属性值为null,则跳过该属性 | 218 | * 将对象的所有属性转换到list数组中以objce数组存储,数组长度为2,第一个为属性名,第二个为属性值,如果对象属性值为null,则跳过该属性 |
| 177 | - * 在字符串驼峰命名转化成下划线形式 | ||
| 178 | - * 如 helloWord -> hello_word | 219 | + * 在字符串驼峰命名转化成下划线形式 如 helloWord -> hello_word |
| 220 | + * | ||
| 179 | * @param source | 221 | * @param source |
| 180 | * @param isCopyNull | 222 | * @param isCopyNull |
| 181 | * @param exceptFieldNameArray | 223 | * @param exceptFieldNameArray |
| 182 | * @return | 224 | * @return |
| 183 | */ | 225 | */ |
| 184 | - public static List<Object[]> objecFieldToListToLowerCase(Object source, boolean isCopyNull, String exceptFieldNameArray[]){ | 226 | + public static List<Object[]> objecFieldToListToLowerCase(Object source, boolean isCopyNull, |
| 227 | + String exceptFieldNameArray[]) { | ||
| 185 | List<Object[]> result = new ArrayList<Object[]>(); | 228 | List<Object[]> result = new ArrayList<Object[]>(); |
| 186 | - //参数检验 | ||
| 187 | - if(source == null){ | 229 | + // 参数检验 |
| 230 | + if (source == null) { | ||
| 188 | return result; | 231 | return result; |
| 189 | } | 232 | } |
| 190 | - | ||
| 191 | - //获取Field数组 | ||
| 192 | - Field[] sourceField = source.getClass().getDeclaredFields(); | ||
| 193 | - //遍历源field数组,处理源field数组 | ||
| 194 | - for(int i=0; i<sourceField.length; ++i){ | ||
| 195 | - //获取源field相关信息 | 233 | + |
| 234 | + // 获取Field数组 | ||
| 235 | + Field[] sourceField = getAndCachedFields(source.getClass()); | ||
| 236 | + // 遍历源field数组,处理源field数组 | ||
| 237 | + for (int i = 0; i < sourceField.length; ++i) { | ||
| 238 | + // 获取源field相关信息 | ||
| 196 | Object sourceFieldValue = null; | 239 | Object sourceFieldValue = null; |
| 197 | String sourceFieldName = sourceField[i].getName(); | 240 | String sourceFieldName = sourceField[i].getName(); |
| 198 | - | ||
| 199 | - //获取sourceFieldValue值 | 241 | + |
| 242 | + // 获取sourceFieldValue值 | ||
| 200 | sourceField[i].setAccessible(true); | 243 | sourceField[i].setAccessible(true); |
| 201 | try { | 244 | try { |
| 202 | sourceFieldValue = sourceField[i].get(source); | 245 | sourceFieldValue = sourceField[i].get(source); |
| 203 | - } catch (Exception e1) { } | ||
| 204 | - | ||
| 205 | - //检查是否在exceptFieldName中 | ||
| 206 | - if(-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)){ | 246 | + } catch (Exception e1) { |
| 247 | + } | ||
| 248 | + | ||
| 249 | + // 检查是否在exceptFieldName中 | ||
| 250 | + if (-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)) { | ||
| 207 | continue; | 251 | continue; |
| 208 | } | 252 | } |
| 209 | - | ||
| 210 | - //检验sourceFieldValue是否为NULL | ||
| 211 | - if(!isCopyNull && sourceFieldValue == null){ | 253 | + |
| 254 | + // 检验sourceFieldValue是否为NULL | ||
| 255 | + if (!isCopyNull && sourceFieldValue == null) { | ||
| 212 | continue; | 256 | continue; |
| 213 | } | 257 | } |
| 214 | sourceFieldName = UtilString.underscoreName(sourceFieldName).toLowerCase(); | 258 | sourceFieldName = UtilString.underscoreName(sourceFieldName).toLowerCase(); |
| 215 | - //添加属性 | ||
| 216 | - result.add(new Object[]{sourceFieldName, sourceFieldValue}); | 259 | + // 添加属性 |
| 260 | + result.add(new Object[] { sourceFieldName, sourceFieldValue }); | ||
| 217 | } | 261 | } |
| 218 | - | 262 | + |
| 219 | return result; | 263 | return result; |
| 220 | } | 264 | } |
| 221 | - | 265 | + |
| 222 | /** | 266 | /** |
| 223 | * 将对象的所有属性转换到list数组中以objce数组存储,数组长度为2,第一个为属性名,第二个为属性值,如果对象属性值为null,则跳过该属性 | 267 | * 将对象的所有属性转换到list数组中以objce数组存储,数组长度为2,第一个为属性名,第二个为属性值,如果对象属性值为null,则跳过该属性 |
| 268 | + * | ||
| 224 | * @param source | 269 | * @param source |
| 225 | * @param allowNull | 270 | * @param allowNull |
| 226 | * @param exceptFieldNameArray | 271 | * @param exceptFieldNameArray |
| 227 | * @return | 272 | * @return |
| 228 | */ | 273 | */ |
| 229 | - public static List<Object[]> fieldToArray(Object source, boolean allowNull, String exceptFieldNameArray[]){ | 274 | + public static List<Object[]> fieldToArray(Object source, boolean allowNull, String exceptFieldNameArray[]) { |
| 230 | List<Object[]> result = new ArrayList<Object[]>(); | 275 | List<Object[]> result = new ArrayList<Object[]>(); |
| 231 | - //参数检验 | ||
| 232 | - if(source == null){ | 276 | + // 参数检验 |
| 277 | + if (source == null) { | ||
| 233 | return result; | 278 | return result; |
| 234 | } | 279 | } |
| 235 | - | ||
| 236 | - //获取Field数组 | ||
| 237 | - Field[] sourceField = source.getClass().getDeclaredFields(); | ||
| 238 | - //遍历源field数组,处理源field数组 | ||
| 239 | - for(int i=0; i<sourceField.length; ++i){ | ||
| 240 | - //获取源field相关信息 | 280 | + |
| 281 | + // 获取Field数组 | ||
| 282 | + Field[] sourceField = getAndCachedFields(source.getClass()); | ||
| 283 | + // 遍历源field数组,处理源field数组 | ||
| 284 | + for (int i = 0; i < sourceField.length; ++i) { | ||
| 285 | + // 获取源field相关信息 | ||
| 241 | Object sourceFieldValue = null; | 286 | Object sourceFieldValue = null; |
| 242 | String sourceFieldName = sourceField[i].getName(); | 287 | String sourceFieldName = sourceField[i].getName(); |
| 243 | - | ||
| 244 | - //获取sourceFieldValue值 | 288 | + |
| 289 | + // 获取sourceFieldValue值 | ||
| 245 | sourceField[i].setAccessible(true); | 290 | sourceField[i].setAccessible(true); |
| 246 | try { | 291 | try { |
| 247 | sourceFieldValue = sourceField[i].get(source); | 292 | sourceFieldValue = sourceField[i].get(source); |
| 248 | - } catch (Exception e1) { } | ||
| 249 | - | ||
| 250 | - //检查是否在exceptFieldName中 | ||
| 251 | - if(-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)){ | 293 | + } catch (Exception e1) { |
| 294 | + } | ||
| 295 | + | ||
| 296 | + // 检查是否在exceptFieldName中 | ||
| 297 | + if (-1 != UtilString.getStringIndex(sourceFieldName, exceptFieldNameArray)) { | ||
| 252 | continue; | 298 | continue; |
| 253 | } | 299 | } |
| 254 | - | ||
| 255 | - //检验sourceFieldValue是否为NULL | ||
| 256 | - if(!allowNull && sourceFieldValue == null){ | 300 | + |
| 301 | + // 检验sourceFieldValue是否为NULL | ||
| 302 | + if (!allowNull && sourceFieldValue == null) { | ||
| 257 | continue; | 303 | continue; |
| 258 | } | 304 | } |
| 259 | - | ||
| 260 | - //添加属性 | ||
| 261 | - result.add(new Object[]{sourceFieldName, sourceFieldValue}); | 305 | + |
| 306 | + // 添加属性 | ||
| 307 | + result.add(new Object[] { sourceFieldName, sourceFieldValue }); | ||
| 262 | } | 308 | } |
| 263 | - | 309 | + |
| 264 | return result; | 310 | return result; |
| 265 | - } | ||
| 266 | - | ||
| 267 | - public static <E> E mapToObject(Map<String, Object> dataMap, Class<E> beanClass, boolean isCopyNull, String exceptFieldNameArray[]) throws Exception{ | ||
| 268 | - if(beanClass == null){ | 311 | + } |
| 312 | + | ||
| 313 | + public static <E> E mapToObject(Map<String, Object> dataMap, Class<E> beanClass, boolean isCopyNull, | ||
| 314 | + String exceptFieldNameArray[]) throws Exception { | ||
| 315 | + if (beanClass == null) { | ||
| 269 | return null; | 316 | return null; |
| 270 | } | 317 | } |
| 271 | E result = beanClass.newInstance(); | 318 | E result = beanClass.newInstance(); |
| 272 | Iterator<String> keyIter = dataMap.keySet().iterator(); | 319 | Iterator<String> keyIter = dataMap.keySet().iterator(); |
| 273 | - while(keyIter.hasNext()){ | 320 | + while (keyIter.hasNext()) { |
| 274 | String keyName = keyIter.next(); | 321 | String keyName = keyIter.next(); |
| 275 | String camelName = UtilString.camelName(keyName); | 322 | String camelName = UtilString.camelName(keyName); |
| 276 | Object keyValue = dataMap.get(keyName); | 323 | Object keyValue = dataMap.get(keyName); |
| 277 | - | ||
| 278 | - if(keyValue == null){ | 324 | + |
| 325 | + if (keyValue == null) { | ||
| 326 | + continue; | ||
| 327 | + } | ||
| 328 | + | ||
| 329 | + Field keyField = findDeclaredField(beanClass, camelName); | ||
| 330 | + if (keyField == null) { | ||
| 279 | continue; | 331 | continue; |
| 280 | } | 332 | } |
| 281 | - | ||
| 282 | - Field keyField = beanClass.getDeclaredField(camelName); | ||
| 283 | String keyTypeName = keyField.getType().getSimpleName(); | 333 | String keyTypeName = keyField.getType().getSimpleName(); |
| 284 | - | ||
| 285 | - //如果是final关键词修饰,则返回 | ||
| 286 | - if(Modifier.isFinal(keyField.getModifiers())){ | 334 | + |
| 335 | + // 如果是final关键词修饰,则返回 | ||
| 336 | + if (Modifier.isFinal(keyField.getModifiers())) { | ||
| 287 | continue; | 337 | continue; |
| 288 | } | 338 | } |
| 289 | - | ||
| 290 | - if(keyTypeName.equals("String")){ | 339 | + |
| 340 | + if (keyTypeName.equals("String")) { | ||
| 291 | keyField.set(result, keyValue.toString()); | 341 | keyField.set(result, keyValue.toString()); |
| 292 | - }else if(keyTypeName.equals("Integer")){ | 342 | + } else if (keyTypeName.equals("Integer")) { |
| 293 | keyField.set(result, Integer.valueOf(keyValue.toString())); | 343 | keyField.set(result, Integer.valueOf(keyValue.toString())); |
| 294 | } | 344 | } |
| 295 | } | 345 | } |
| 296 | return result; | 346 | return result; |
| 297 | } | 347 | } |
| 298 | - | ||
| 299 | - public static <E> E mapToObject(Map<String, Object> dataMap, Class<E> beanClass) throws Exception{ | ||
| 300 | - if(beanClass == null){ | 348 | + |
| 349 | + public static <E> E mapToObject(Map<String, Object> dataMap, Class<E> beanClass) throws Exception { | ||
| 350 | + if (beanClass == null) { | ||
| 301 | return null; | 351 | return null; |
| 302 | } | 352 | } |
| 303 | E result = beanClass.newInstance(); | 353 | E result = beanClass.newInstance(); |
| 304 | Iterator<String> keyIter = dataMap.keySet().iterator(); | 354 | Iterator<String> keyIter = dataMap.keySet().iterator(); |
| 305 | - while(keyIter.hasNext()){ | 355 | + while (keyIter.hasNext()) { |
| 306 | String keyName = keyIter.next(); | 356 | String keyName = keyIter.next(); |
| 307 | String camelName = UtilString.camelName(keyName); | 357 | String camelName = UtilString.camelName(keyName); |
| 308 | Object keyValue = dataMap.get(keyName); | 358 | Object keyValue = dataMap.get(keyName); |
| 309 | - | ||
| 310 | - if(keyValue == null){ | 359 | + |
| 360 | + if (keyValue == null) { | ||
| 311 | continue; | 361 | continue; |
| 312 | } | 362 | } |
| 313 | - | 363 | + |
| 314 | try { | 364 | try { |
| 315 | - Field keyField = beanClass.getDeclaredField(camelName); | ||
| 316 | - | ||
| 317 | - //如果是final关键词修饰,则返回 | ||
| 318 | - if(Modifier.isFinal(keyField.getModifiers())){ | 365 | + Field keyField = findDeclaredField(beanClass, camelName); |
| 366 | + if (keyField == null) { | ||
| 367 | + continue; | ||
| 368 | + } | ||
| 369 | + | ||
| 370 | + // 如果是final关键词修饰,则返回 | ||
| 371 | + if (Modifier.isFinal(keyField.getModifiers())) { | ||
| 319 | continue; | 372 | continue; |
| 320 | } | 373 | } |
| 321 | - | 374 | + |
| 322 | keyField.setAccessible(true); | 375 | keyField.setAccessible(true); |
| 323 | keyField.set(result, keyValue); | 376 | keyField.set(result, keyValue); |
| 324 | - } catch (Exception e) { } | 377 | + } catch (Exception e) { |
| 378 | + } | ||
| 325 | } | 379 | } |
| 326 | return result; | 380 | return result; |
| 327 | } | 381 | } |
| 328 | - | ||
| 329 | - public static void main(String args[]){ | ||
| 330 | - | ||
| 331 | - class Temp2{ | 382 | + |
| 383 | + private static Field findDeclaredField(Class beanClass, String camelName) { | ||
| 384 | + Field[] dataArr = getAndCachedFields(beanClass); | ||
| 385 | + if (dataArr == null || dataArr.length == 0) { | ||
| 386 | + return null; | ||
| 387 | + } | ||
| 388 | + for (Field item : dataArr) { | ||
| 389 | + if (item.getName().equals(camelName)) { | ||
| 390 | + return item; | ||
| 391 | + } | ||
| 392 | + } | ||
| 393 | + return null; | ||
| 394 | + } | ||
| 395 | + | ||
| 396 | + public static void main(String args[]) { | ||
| 397 | + | ||
| 398 | + class Temp2 { | ||
| 332 | final Integer a; | 399 | final Integer a; |
| 333 | Integer c; | 400 | Integer c; |
| 334 | - public Temp2(Integer a, Integer c){ | 401 | + |
| 402 | + public Temp2(Integer a, Integer c) { | ||
| 335 | this.a = a; | 403 | this.a = a; |
| 336 | this.c = c; | 404 | this.c = c; |
| 337 | } | 405 | } |
| 406 | + | ||
| 338 | @Override | 407 | @Override |
| 339 | - public String toString(){ | ||
| 340 | - return "a="+a+":c="+c; | 408 | + public String toString() { |
| 409 | + return "a=" + a + ":c=" + c; | ||
| 341 | } | 410 | } |
| 342 | } | 411 | } |
| 343 | 412 | ||
| 344 | - class Temp{ | 413 | + class Temp extends Temp2 { |
| 345 | Integer a; | 414 | Integer a; |
| 346 | Integer b; | 415 | Integer b; |
| 347 | - public Temp(Integer a, Integer b){ | 416 | + |
| 417 | + public Temp(Integer a, Integer b) { | ||
| 418 | + super(a, b); | ||
| 348 | this.a = a; | 419 | this.a = a; |
| 349 | this.b = b; | 420 | this.b = b; |
| 350 | } | 421 | } |
| 422 | + | ||
| 351 | @Override | 423 | @Override |
| 352 | - public String toString(){ | ||
| 353 | - return "a="+a+":b="+b; | 424 | + public String toString() { |
| 425 | + return "a=" + a + ":b=" + b; | ||
| 354 | } | 426 | } |
| 355 | } | 427 | } |
| 356 | - | ||
| 357 | - Temp temp1 = new Temp(null,2); | ||
| 358 | - Temp temp2 = new Temp(3,4); | ||
| 359 | - Temp temp3 = new Temp(5,6); | ||
| 360 | - Temp2 temp4 = new Temp2(7,8); | ||
| 361 | - | 428 | + |
| 429 | + Temp temp1 = new Temp(null, 2); | ||
| 430 | + Temp temp2 = new Temp(3, 4); | ||
| 431 | + Temp temp3 = new Temp(5, 6); | ||
| 432 | + Temp2 temp4 = new Temp2(7, 8); | ||
| 433 | + | ||
| 362 | try { | 434 | try { |
| 363 | - Field a= temp4.getClass().getDeclaredField("a"); | ||
| 364 | - System.out.print(Modifier.isFinal(a.getModifiers())); | ||
| 365 | - } catch (NoSuchFieldException e) { | ||
| 366 | - // TODO Auto-generated catch block | ||
| 367 | - e.printStackTrace(); | 435 | +//// Field a= temp4.getClass().getDeclaredField("a"); |
| 436 | +//// System.out.print(Modifier.isFinal(a.getModifiers())); | ||
| 437 | +// getAndCachedFields(Temp.class); | ||
| 368 | } catch (SecurityException e) { | 438 | } catch (SecurityException e) { |
| 369 | // TODO Auto-generated catch block | 439 | // TODO Auto-generated catch block |
| 370 | e.printStackTrace(); | 440 | e.printStackTrace(); |
| 371 | } | 441 | } |
| 442 | + | ||
| 372 | 443 | ||
| 373 | - /*fieldCopy(temp1, temp2, false, null,false); | ||
| 374 | - System.out.println(temp1.toString()); | ||
| 375 | - System.out.println(temp2.toString()); | ||
| 376 | - | ||
| 377 | - fieldCopy(temp3, temp4, false, null,false); | ||
| 378 | - System.out.println(temp3.toString()); | ||
| 379 | - System.out.println(temp4.toString()); | ||
| 380 | - | ||
| 381 | - List<Object[]> temp = UtilObject.fieldToArray(temp1, false, new String[]{"b"}); | ||
| 382 | - for(int i=0; i<temp.size(); ++i){ | ||
| 383 | - System.out.println(temp.get(i)[0]+":"+temp.get(i)[1]); | ||
| 384 | - } */ | 444 | + fieldCopy(temp1, temp2, false, null,false); |
| 445 | + System.out.println(temp1.toString()); System.out.println(temp2.toString()); | ||
| 446 | + | ||
| 447 | + fieldCopy(temp3, temp4, false, null,false); | ||
| 448 | + System.out.println(temp3.toString()); System.out.println(temp4.toString()); | ||
| 449 | + | ||
| 450 | + List<Object[]> temp = UtilObject.fieldToArray(temp1, false, new | ||
| 451 | + String[]{"b"}); for(int i=0; i<temp.size(); ++i){ | ||
| 452 | + System.out.println(temp.get(i)[0]+":"+temp.get(i)[1]); } | ||
| 453 | + | ||
| 385 | } | 454 | } |
| 386 | } | 455 | } |
| 387 | \ No newline at end of file | 456 | \ No newline at end of file |