Java中對比兩個對象中屬性值[反射、注解]


             在Java中通常要比較兩個對象在修改前與修改后的值是否相同,一般我們采用的是反射技術獲取對象的get方法[或其他的方法]獲取值並做比較。如果系統將修改的屬性名稱也顯示出來,這樣就能更直觀的顯示類中的哪一個屬性的值被修改了。然后Java中只能獲取屬性的名稱,也就是英文標識的屬性名,但是一般我們都會在屬性后面添加屬性的注釋,但是Java不提供注釋獲取的方法。所以我們只能使用另外一種方式來將屬性和屬性注釋關聯起來,這就是Java中的@Annotation。

    

public static  Map<String, Map<String, String>> compile(Object db, Object new_) { Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();//存放修改前與修改后的屬性值 Class<Object> cDb = (Class<Object>) db.getClass(); Field[] filesDb = cDb.getDeclaredFields(); Class<Object> cNew_ = (Class<Object>) new_.getClass(); Map<String, String> valDbMap = new HashMap<String, String>();//存放修改前的已修改的值 Map<String, String> valNewMap = new HashMap<String, String>();//存放修改后的值 for (Field field : filesDb) { String getMethodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); try { Method mdb = (Method) cDb.getMethod(getMethodName); Method mNew_ = (Method) cNew_.getMethod(getMethodName); //自定義實現的注解類 Annotation meta = mdb.getAnnotation(Annotation.class);   try { if(meta!= null){ Object valDb = mdb.invoke(db); Object valNew = mNew_.invoke(new_); if (valDb != null) { if (!valDb.equals(valNew)) {  valDbMap.put(meta.annotation(), String.valueOf(valDb));  valNewMap.put(meta.annotation(), String.valueOf(valNew)); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }  } catch (NoSuchMethodException e) { log.debug("沒有這個方法可顯示調用"); } catch (SecurityException e) { e.printStackTrace(); } } map.put("更改前", valDbMap); map.put("更改后", valNewMap); return map; }

   后面提供注解類,這里比較簡單,其實不想寫的,但是為了方便需要的人還是提供自定義的注解類:

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Annotation { public String annotation(); }

    注解類的定義這塊我就不說了。怎么使用呢,在我們需要比較的類的方法上面添加@Annotation(annotation="注釋")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM