標籤:
在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="注釋")
此案例中我的方法是get方法。 後面的我就不提供了,有問題的歡迎提出。
Java中對比兩個對象中屬性值[反射、註解]