欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Java中如何比較兩個對象淺析

 更新時間:2021年11月24日 16:51:38   作者:deniro  
在工作中我們經(jīng)常會遇到這樣的需求——比較兩個對象是否相等,如果不相等的話,取出不相等的字段,這篇文章主要給大家介紹了關(guān)于在Java中如何比較兩個對象的相關(guān)資料,需要的朋友可以參考下

Common Lang 中的 Builder 包內(nèi)提供了一個 DiffBuilder 類,可以比較兩個對象,并返回不同的部分。

  1. 首先在要比較對象的類中實現(xiàn) Diffable 接口,然后實現(xiàn) DiffResult diff(T obj)? 方法。
  2. 在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的maven多模塊混淆jar包的實現(xiàn)方法

    springboot可以使用proguard-maven-plugin 這個插件 在 pom.xml 中自定義proguard 的指令,本文基于 springboot + maven + proguard 的maven多模塊架構(gòu)進行代碼混淆,需要的朋友可以參考下
    2024-03-03
  • 生成8位隨機不重復(fù)的數(shù)字編號的方法

    生成8位隨機不重復(fù)的數(shù)字編號的方法

    生成隨機不重復(fù)的數(shù)字編號在某些情況下也會用到,本文以生成8位隨機不重復(fù)的數(shù)字編號為例與大家分享下具體的實現(xiàn)過程,感興趣的朋友可以參考下
    2013-09-09
  • Spring詳解使用注解開發(fā)流程

    Spring詳解使用注解開發(fā)流程

    這篇文章主要為大家詳細介紹了Spring如何使用注解開發(fā),文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • Redisson可重入鎖解鎖邏輯詳細講解

    Redisson可重入鎖解鎖邏輯詳細講解

    Redisson開源框架是一個Redis的分布式鎖的現(xiàn)成實現(xiàn)方案,是Redis的java實現(xiàn)的客戶端。通過Netty支持非阻塞I/O。Redisson實現(xiàn)了分布式鎖的自動續(xù)期機制、鎖的互斥自等待機制、鎖的可重入加鎖與釋放鎖的機制
    2023-02-02
  • Java線程并發(fā)訪問代碼分析

    Java線程并發(fā)訪問代碼分析

    這篇文章主要介紹了Java線程并發(fā)訪問代碼分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot web靜態(tài)資源配置詳解

    SpringBoot web靜態(tài)資源配置詳解

    這篇文章主要介紹了SpringBoot web靜態(tài)資源配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • spring中@Autowired自動注入依賴項的使用

    spring中@Autowired自動注入依賴項的使用

    當使用@Autowired注解時,它可以自動注入依賴項,例如其他類的實例,本文就來詳細的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java設(shè)計模式之組合模式(Composite模式)介紹

    Java設(shè)計模式之組合模式(Composite模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之組合模式(Composite模式)介紹,Composite定義:將對象以樹形結(jié)構(gòu)組織起來,以達成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對單個對象和組合對象的使用具有一致性,需要的朋友可以參考下
    2015-03-03
  • SpringBoot整合Kaptcha實現(xiàn)圖形驗證碼功能

    SpringBoot整合Kaptcha實現(xiàn)圖形驗證碼功能

    這篇文章主要介紹了SpringBoot整合Kaptcha實現(xiàn)圖形驗證碼功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Java中Integer的parseInt和valueOf的區(qū)別詳解

    Java中Integer的parseInt和valueOf的區(qū)別詳解

    這篇文章主要介紹了Java中Integer的parseInt和valueOf的區(qū)別詳解,nteger.parseInt(s)是把字符串解析成int基本類型,Integer.valueOf(s)是把字符串解析成Integer對象類型,其實int就是Integer解包裝,Integer就是int的包裝,需要的朋友可以參考下
    2023-11-11

最新評論