在Java中如何比較兩個對象淺析
Common Lang 中的 Builder 包內(nèi)提供了一個 DiffBuilder 類,可以比較兩個對象,并返回不同的部分。
- 首先在要比較對象的類中實現(xiàn) Diffable 接口,然后實現(xiàn) DiffResult diff(T obj)? 方法。
- 在DiffResult diff(T obj)? 方法中,新建一個 DiffBuilder 對象,把需要比較的類屬性一一放入 DiffBuilder 中。
DiffBuilder 的構(gòu)造函數(shù)有三個入?yún)?,lhs 是當前對象,rhs 是要比較的對象,style 是比較結(jié)果輸出的格式。
DiffBuilder(final T lhs, final T rhs, final ToStringStyle style)
假設(shè)有一個 Person 類定義了三個屬性 name、age 和 smoker。以下是使用不同的 ToStringStyle 所對應(yīng)的輸出內(nèi)容。
ToStringStyle | 說明 | 輸出 |
---|---|---|
SHORT_PREFIX_STYLE | 簡短 | Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true] |
DEFAULT_STYLE | 默認 | org.apache.commons.lang3.builder.Person@9f70c54[name=deniro,smoker=false] differs from org.apache.commons.lang3.builder.Person@234bef66[name=jack,smoker=true]。 |
MULTI_LINE_STYLE | 多行 | org.apache.commons.lang3.builder.Person@9f70c54[ name=deniro smoker=false ] differs from org.apache.commons.lang3.builder.Person@234bef66[ name=jack smoker=true ] |
NO_FIELD_NAMES_STYLE | 不包含類屬性名 | org.apache.commons.lang3.builder.Person@9f70c54[deniro,false] differs from org.apache.commons.lang3.builder.Person@234bef66[jack,true]。 |
SIMPLE_STYLE | 簡潔 | deniro,false differs from jack,true。 |
NO_CLASS_NAME_STYLE | 不包含類名 | [name=deniro,smoker=false] differs from [name=jack,smoker=true]。 |
JSON_STYLE | JSON | {"name":"deniro","smoker":false} differs from {"name":"jack","smoker":true}。 |
感覺 NO_CLASS_NAME_STYLE 與 JSON_STYLE 看的更清楚。
完整示例:
public class Person implements Diffable<Person> { private static final Logger log = LoggerFactory.getLogger(Person.class); String name; int age; boolean smoker; public DiffResult diff(Person obj) { // No need for null check, as NullPointerException correct if obj is null return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE) .append("name", this.name, obj.name) .append("age", this.age, obj.age) .append("smoker", this.smoker, obj.smoker) .build(); } public static void main(String[] args) { Person a = new Person(); a.name = "deniro"; a.age = 22; a.smoker = false; Person b = new Person(); b.name = "jack"; b.age = 22; b.smoker = true; DiffResult result = a.diff(b); log.info("result -> {}。", result); } }
輸出:
result -> Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]。
如果是個大類,那么需要很多個 append 方法把這個大類的屬性放到 DiffBuilder 中,不太方便。可以寫個程序生成 DiffBuilder 初始化代碼,或者嘗試用反射來優(yōu)化這部分代碼。
反射擴展:
(1)獲取對象所屬類的Class方法。
Class c = Class.forName("包.類名稱");
(2)獲得該類的所有Filed(不包括父類)。
Field[] fields = c.getDeclaredFields();
(3)將所有屬性的訪問權(quán)限設(shè)為true。
因為JavaBean中所有的屬性訪問權(quán)限都是private,所以無法直接獲得所有屬性,因此我們必須獲得其訪問權(quán)限,通過下面的方法完成:
setAccessible(true);
(4)輸出對象屬性
f.getField(對象名稱);
(5)獲取字段名
fields[j].getName()
(6)獲取字段值
fields[j].get(obj)
參考資料
commons.apache.org/proper/comm…
總結(jié)
到此這篇關(guān)于在Java中如何比較兩個對象的文章就介紹到這了,更多相關(guān)Java比較兩個對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot的maven多模塊混淆jar包的實現(xiàn)方法
springboot可以使用proguard-maven-plugin 這個插件 在 pom.xml 中自定義proguard 的指令,本文基于 springboot + maven + proguard 的maven多模塊架構(gòu)進行代碼混淆,需要的朋友可以參考下2024-03-03Java設(shè)計模式之組合模式(Composite模式)介紹
這篇文章主要介紹了Java設(shè)計模式之組合模式(Composite模式)介紹,Composite定義:將對象以樹形結(jié)構(gòu)組織起來,以達成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對單個對象和組合對象的使用具有一致性,需要的朋友可以參考下2015-03-03SpringBoot整合Kaptcha實現(xiàn)圖形驗證碼功能
這篇文章主要介紹了SpringBoot整合Kaptcha實現(xiàn)圖形驗證碼功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09Java中Integer的parseInt和valueOf的區(qū)別詳解
這篇文章主要介紹了Java中Integer的parseInt和valueOf的區(qū)別詳解,nteger.parseInt(s)是把字符串解析成int基本類型,Integer.valueOf(s)是把字符串解析成Integer對象類型,其實int就是Integer解包裝,Integer就是int的包裝,需要的朋友可以參考下2023-11-11