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

來源:互聯網
上載者:User

標籤:

             在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中對比兩個對象中屬性值[反射、註解]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.