测试一篇文章
这是我的一篇用于测试用的文章,
我也不知道怎么去写
1 public class BeanUtils { 2 3 4 /** 5 * 比较两个对象是否相等 6 * @param newFiled 封装修改信息 7 * @param logMap 封装日志 8 * @param oldObj 旧的对象 9 * @param newObj 新的对象 10 */ 11 public static void differBean(Map<String, Object> newFiled, Map<String, LogContent> logMap, String parName, Object oldObj, Object newObj){ 12 //不需要比较的值有 createTime/lastUpdateTime/status/resourceId 13 try { 14 if(oldObj.getClass()==newObj.getClass()){//只有两个对象都是同一类型的才有可比性 15 Class clazz = oldObj.getClass(); 16 PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors(); 17 for(PropertyDescriptor pd : pds){ 18 19 Field f = clazz.getDeclaredField(pd.getName()); 20 f.setAccessible(true); 21 if(f.getAnnotation(Transient.class) != null || f.getAnnotation(Id.class) != null || f.getAnnotation(DNU.class)!=null){ 22 continue; 23 } 24 25 String name = null; 26 if(parName != null){ 27 name = parName+"."+pd.getName(); 28 }else{ 29 name = pd.getName(); 30 } 31 32 Object oldVal = pd.getReadMethod().invoke(oldObj, null); 33 Object newVal = pd.getReadMethod().invoke(newObj, null); 34 35 if(oldVal == null && newVal == null){ 36 continue; 37 }else if(oldVal != null && oldVal.equals(newVal)){ 38 continue; 39 }else if(newVal != null && newVal.equals(oldVal)){ 40 continue; 41 } 42 43 //1. 基本类型 44 if(isBaseData(pd.getPropertyType())){ 45 //不更新 46 if("createTime".equals(name) || "status".equals(name)){ 47 continue; 48 } 49 //更新 50 if(newVal == null){ 51 newFiled.put(name+"|unset", newVal); 52 }else{ 53 newFiled.put(name, newVal); 54 } 55 //日志 56 if(!"lastUpdateTime".equals(name)){ 57 logMap.put(name, new LogContent(oldVal+"", newVal+"")); 58 //logMap.put(name, "<p><strong>" + name + ":</strong><small><del>" + oldVal + "</del><span class='text-danger'>" + newVal+"</span></small></p>"); 59 //logMap.put(name, "字段名称:" + name + "旧值:" + oldVal + "新值:" + newVal); 60 } 61 62 //2. 接口类型 63 }else if(pd.getPropertyType().isInterface()){ 64 //List 65 if(List.class.equals(pd.getPropertyType())){ 66 List<Object> oldList = (List<Object>) oldVal; 67 List<Object> newList = (List<Object>) newVal; 68 //更新 69 newFiled.put(name, newList); 70 71 if(oldList != null && oldList.size()>0 && newList != null && newList.size()>0){ 72 Object t = oldList.get(0); 73 if(isBaseData(t.getClass())){ 74 //比较两个List 75 compareList(oldList, newList, name, logMap); 76 }else{ 77 int max = oldList.size(); 78 max = max < newList.size()? newList.size():oldList.size(); 79 for(int i = 0;i<max;i++){ 80 Object oldListObj = null; 81 try { 82 oldListObj = oldList.get(i); 83 } catch (Exception e) { 84 oldListObj = ""; 85 } 86 Object newListObj = null; 87 try { 88 newListObj = newList.get(i); 89 } catch (Exception e) { 90 newListObj = ""; 91 } 92 if(!"".equals(oldListObj) && !"".equals(newListObj)){ 93 differObject(logMap, name+"["+i+"]", oldListObj, newListObj); 94 }else{ 95 logMap.put(name+"["+i+"]", new LogContent(oldListObj+"", newListObj+"")); 96 } 97 } 98 } 99 100 }else{ 101 logMap.put(name, new LogContent(oldList+"", newList+"")); 102 //logMap.put(name, "<p><strong>" + name + ":</strong><small><del>" + oldList + "</del><span class='text-danger'>" + newList+"</span></small></p>"); 103 //logMap.put(name, "字段名称:" + name + "旧值:" + oldList + "新值:" + newList); 104 } 105 //Map 106 }else if(Map.class.equals(pd.getPropertyType())){ 107 Map<String, Object> oldMap = (Map<String, Object>) oldVal; 108 Map<String, Object> newMap = (Map<String, Object>) newVal; 109 if(oldMap != null && newMap != null){ 110 //比较两个Map 111 Class tempClazz = null; 112 for(Object obj : oldMap.values()){ 113 if(obj == null){ 114 continue; 115 } 116 tempClazz = obj.getClass(); 117 break; 118 } 119 if(tempClazz == null){ 120 for(Object obj : newMap.values()){ 121 if(obj == null){ 122 continue; 123 } 124 tempClazz = obj.getClass(); 125 break; 126 } 127 } 128 if(tempClazz == null){ 129 continue; 130 } 131 //Map的值是基本数据类型 或者接口类型List/Map 132 if(isBaseData(tempClazz) || tempClazz.isInterface()){ 133 compareMap(oldMap, newMap, name, newFiled, logMap);//比较Map 134 //Map的值不是基本数据类型 135 }else{ 136 String tempName = null; 137 for(String key : oldMap.keySet()){ 138 tempName = name + "." + key; 139 if(newMap.get(key) == null){ 140 newFiled.put("unset|"+tempName, oldMap.get(key));//删除 141 logMap.put(tempName, new LogContent(oldMap.get(key)+"", "")); 142 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><del>" + oldMap.get(key) + "</del></small></p>"); 143 //logMap.put(tempName, "移除:字段名称:"+tempName + "原值" + oldMap.get(key)); 144 }else{ 145 Object oldmVal = oldMap.get(key); 146 Object newmVal = newMap.get(key); 147 if(oldmVal != newmVal){ 148 differBean(newFiled, logMap, tempName, oldmVal, newmVal); 149 } 150 } 151 } 152 for(String key : newMap.keySet()){ 153 if(oldMap.get(key) == null){ 154 tempName = name + "." + key; 155 newFiled.put(tempName, newMap.get(key)); 156 logMap.put(tempName, new LogContent("", newMap.get(key)+"")); 157 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><span class='text-danger'>" + newMap.get(key)+"</span></small></p>"); 158 //logMap.put(tempName, "添加:字段名称:"+tempName + "新值" + newMap.get(key)); 159 } 160 } 161 162 } 163 }else{ 164 newFiled.put(name, newMap); 165 logMap.put(name, new LogContent(oldMap+"", newMap+"")); 166 //logMap.put(name, "<p><strong>" + name + ":</strong><small><del>" + oldMap + "</del><span class='text-danger'>" + oldMap+"</span></small></p>"); 167 //logMap.put(name, "字段名称:" + name + "旧值:" + oldMap + "新值:" + newMap); 168 } 169 } 170 //3. 对象 171 }else{ 172 differBean(newFiled, logMap,name, oldVal, newVal); 173 } 174 } 175 } 176 } catch (Exception e) { 177 throw new AppException("修改生成Update失败"); 178 } 179 } 180 181 182 183 /** 184 * 比较两个map 185 * @param oldMap 186 * @param newMap 187 * @param name 188 * @param newFiled 189 * @param logMap 190 */ 191 private static void compareMap(Map<String, Object> oldMap, 192 Map<String, Object> newMap, String name, 193 Map<String, Object> newFiled, Map<String, LogContent> logMap) { 194 if(newFiled == null){ 195 newFiled = new LinkedHashMap<String, Object>(); 196 } 197 if(oldMap == null || newMap == null){ 198 throw new AppException("Map比较时出现错误"); 199 } 200 201 String tempName = name; 202 //1. 移除和添加 203 for(String key : oldMap.keySet()){ 204 tempName = name + "." + key; 205 if(newMap.get(key) == null){ 206 newFiled.put(tempName+"|unset", oldMap.get(key));//删除 207 logMap.put(tempName, new LogContent(oldMap.get(key)+"", "")); 208 209 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><del>" + oldMap.get(key) + "</del></small></p>"); 210 //logMap.put(tempName, "移除:字段名称:"+tempName + "原值" + oldMap.get(key)); 211 }else{ 212 Object oldVal = oldMap.get(key); 213 Object newVal = newMap.get(key); 214 if(oldVal != newVal){ 215 newFiled.put(tempName, newVal); 216 logMap.put(tempName, new LogContent(oldVal+"", newVal+"")); 217 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><del>" + oldVal + "</del><span class='text-danger'>" + newVal+"</span></small></p>"); 218 //logMap.put(tempName, "字段名称:"+tempName+"旧值:"+oldVal + "新值:" + newVal); 219 } 220 } 221 } 222 223 //2. 添加 224 for(String key : newMap.keySet()){ 225 if(oldMap.get(key) == null){ 226 tempName = name + "." + key; 227 newFiled.put(tempName, newMap.get(key)); 228 logMap.put(tempName, new LogContent("", newMap.get(key)+"")); 229 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><span class='text-danger'>" + newMap.get(key)+"</span></small></p>"); 230 //logMap.put(tempName, "添加:字段名称:"+tempName + "新值" + newMap.get(key)); 231 } 232 } 233 234 } 235 236 public static void main(String[] args) { 237 List<String> list = new ArrayList<String>(); 238 list.add("aaa"); 239 String a = list.get(0); 240 String b = list.get(1); 241 System.out.println(); 242 } 243 public static void aa(Object obj){ 244 Map<String, String> map = (Map<String, String>) obj; 245 System.out.println(map); 246 } 247 248 /** 249 * 比较两个List 250 * 用于记录日志 251 */ 252 private static void compareList(List<Object> oldList, List<Object> newList, 253 String name, Map<String, LogContent> logMap) { 254 if(oldList == null || newList == null){ 255 throw new AppException("比较错误"); 256 } 257 List<Object> removeList = new ArrayList<Object>(); 258 List<Object> addList = new ArrayList<Object>(); 259 for(Object obj : oldList){ 260 if(!newList.contains(obj)){ 261 removeList.add(obj); 262 } 263 } 264 for(Object obj : newList){ 265 if(!oldList.contains(obj)){ 266 addList.add(obj); 267 } 268 } 269 270 //移除 271 if(!CollectionUtils.isEmpty(removeList)){ 272 logMap.put(name+"_1", new LogContent(removeList.toString(), "")); 273 //logMap.put(name+"_1", "<p><strong>" + name + ":</strong><small><del>" + removeList + "</del></small></p>"); 274 //logMap.put(name, "字段名称:"+name +"移除:" + removeList.toString()); 275 } 276 //添加 277 if(!CollectionUtils.isEmpty(addList)){ 278 logMap.put(name+"_2", new LogContent("", addList.toString())); 279 //logMap.put(name+"_2", "<p><strong>" + name + ":</strong><small><span class='text-danger'>" + addList+"</span></small></p>"); 280 //logMap.put(name, "字段名称:"+name+"增加:"+ addList.toString()); 281 } 282 283 } 284 /** 285 * 判断是否是基本数据类型 286 */ 287 public static boolean isBaseData(Class clazz){ 288 /*byte ——Byte 289 short ——Short 290 int ——Integer 291 long-----Long 292 float-----Float 293 double----Double 294 char----Character 295 boolean---Boolean*/ 296 if(clazz.isPrimitive() || 297 String.class.equals(clazz)|| 298 Byte.class.equals(clazz)|| 299 Short.class.equals(clazz)|| 300 Integer.class.equals(clazz)|| 301 Long.class.equals(clazz)|| 302 Float.class.equals(clazz)|| 303 Double.class.equals(clazz)|| 304 Character.class.equals(clazz)|| 305 Boolean.class.equals(clazz)){ 306 return true; 307 } 308 return false; 309 } 310 311 /** 312 * 迭代记录日志 313 */ 314 private static void differObject(Map<String, LogContent> logMap, String parName, 315 Object oldObj, Object newObj) { 316 try { 317 if(oldObj.getClass()==newObj.getClass()){//只有两个对象都是同一类型的才有可比性 318 Class clazz = oldObj.getClass(); 319 PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors(); 320 for(PropertyDescriptor pd : pds){ 321 Field f = clazz.getDeclaredField(pd.getName()); 322 f.setAccessible(true); 323 if(f.getAnnotation(Transient.class) != null || f.getAnnotation(Id.class) != null || f.getAnnotation(DNU.class)!=null){ 324 continue; 325 } 326 327 String name = null; 328 if(parName != null){ 329 name = parName+"."+pd.getName(); 330 }else{ 331 name = pd.getName(); 332 } 333 334 Object oldVal = pd.getReadMethod().invoke(oldObj, null); 335 Object newVal = pd.getReadMethod().invoke(newObj, null); 336 337 if(oldVal == null && newVal == null){ 338 continue; 339 }else if(oldVal != null && oldVal.equals(newVal)){ 340 continue; 341 }else if(newVal != null && newVal.equals(oldVal)){ 342 continue; 343 } 344 345 //1. 基本类型 346 if(isBaseData(pd.getPropertyType())){ 347 //不记录 348 if("createTime".equals(name) || "status".equals(name)){ 349 continue; 350 } 351 //日志 352 if(!"lastUpdateTime".equals(name)){ 353 logMap.put(name, new LogContent(oldVal+"", newVal+"")); 354 //logMap.put(name, "<p><strong>" + name + ":</strong><small><del>" + oldVal + "</del><span class='text-danger'>" + newVal+"</span></small></p>"); 355 } 356 357 //2. 接口类型 358 }else if(pd.getPropertyType().isInterface()){ 359 //List 360 if(List.class.equals(pd.getPropertyType())){ 361 List<Object> oldList = (List<Object>) oldVal; 362 List<Object> newList = (List<Object>) newVal; 363 364 if(oldList != null && oldList.size()>0&& newList != null &&newList.size()>0){ 365 Object t = oldList.get(0); 366 //更新 367 if(isBaseData(t.getClass())){ 368 //比较两个List 369 compareList(oldList, newList, name, logMap); 370 }else{ 371 int max = oldList.size(); 372 max = max > newList.size()? newList.size():oldList.size(); 373 for(int i = 0;i<max;i++){ 374 Object oldListObj = null; 375 try { 376 oldListObj = oldList.get(i); 377 } catch (Exception e) { 378 oldListObj = ""; 379 } 380 Object newListObj = null; 381 try { 382 newListObj = newList.get(i); 383 } catch (Exception e) { 384 newListObj = ""; 385 } 386 if(!"".equals(oldListObj) && !"".equals(newListObj)){ 387 differObject(logMap, name+"["+i+"]", oldListObj, newListObj); 388 }else{ 389 logMap.put(name+"["+i+"]", new LogContent(oldListObj+"", newListObj+"")); 390 } 391 392 393 } 394 395 } 396 }else{ 397 logMap.put(name, new LogContent(oldList+"", newList+"")); 398 //logMap.put(name, "<p><strong>" + name + ":</strong><small><del>" + oldList + "</del><span class='text-danger'>" + newList+"</span></small></p>"); 399 } 400 //Map 401 }else if(Map.class.equals(pd.getPropertyType())){ 402 Map<String, Object> oldMap = (Map<String, Object>) oldVal; 403 Map<String, Object> newMap = (Map<String, Object>) newVal; 404 if(oldMap != null && newMap != null){ 405 //比较两个Map 406 Class tempClazz = null; 407 for(Object obj : oldMap.values()){ 408 if(obj == null){ 409 continue; 410 } 411 tempClazz = obj.getClass(); 412 break; 413 } 414 if(tempClazz == null){ 415 for(Object obj : newMap.values()){ 416 if(obj == null){ 417 continue; 418 } 419 tempClazz = obj.getClass(); 420 break; 421 } 422 } 423 if(tempClazz == null){ 424 continue; 425 } 426 //Map的值是基本数据类型 或者接口类型List/Map 427 if(isBaseData(tempClazz) || tempClazz.isInterface()){ 428 compareMap(oldMap, newMap, name, null, logMap);//比较Map 429 //Map的值不是基本数据类型 430 }else{ 431 String tempName = null; 432 for(String key : oldMap.keySet()){ 433 tempName = name + "." + key; 434 if(newMap.get(key) == null){ 435 logMap.put(tempName, new LogContent(oldMap.get(key)+"", "")); 436 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><del>" + oldMap.get(key) + "</del></small></p>"); 437 //logMap.put(tempName, "移除:字段名称:"+tempName + "原值" + oldMap.get(key)); 438 }else{ 439 Object oldmVal = oldMap.get(key); 440 Object newmVal = newMap.get(key); 441 if(oldmVal != newmVal){ 442 differObject(logMap, tempName, oldmVal, newmVal); 443 } 444 } 445 } 446 for(String key : newMap.keySet()){ 447 if(oldMap.get(key) == null){ 448 tempName = name + "." + key; 449 logMap.put(tempName, new LogContent("", newMap.get(key)+"")); 450 //logMap.put(tempName, "<p><strong>" + tempName + ":</strong><small><span class='text-danger'>" + newMap.get(key)+"</span></small></p>"); 451 //logMap.put(tempName, "添加:字段名称:"+tempName + "新值" + newMap.get(key)); 452 } 453 } 454 455 } 456 }else{ 457 logMap.put(name, new LogContent(oldMap+"", newMap+"")); 458 } 459 } 460 //3. 对象 461 }else{ 462 differObject(logMap,name, oldVal, newVal); 463 } 464 465 } 466 } 467 } catch (Exception e) { 468 System.out.println(e.getMessage()); 469 } 470 471 } 472 }
学了