亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Java中如何比較兩個(gè)對(duì)象淺析

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

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

  1. 首先在要比較對(duì)象的類中實(shí)現(xiàn) Diffable 接口,然后實(shí)現(xiàn) DiffResult diff(T obj)? 方法。
  2. 在DiffResult diff(T obj)? 方法中,新建一個(gè) DiffBuilder 對(duì)象,把需要比較的類屬性一一放入 DiffBuilder 中。

DiffBuilder 的構(gòu)造函數(shù)有三個(gè)入?yún)?,lhs 是當(dāng)前對(duì)象,rhs 是要比較的對(duì)象,style 是比較結(jié)果輸出的格式。

DiffBuilder(final T lhs, final T rhs,
        final ToStringStyle style)

假設(shè)有一個(gè) Person 類定義了三個(gè)屬性 name、age 和 smoker。以下是使用不同的 ToStringStyle 所對(duì)應(yīng)的輸出內(nèi)容。

ToStringStyle 說明 輸出
SHORT_PREFIX_STYLE 簡(jiǎn)短 Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]
DEFAULT_STYLE 默認(rèn) 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 簡(jiǎn)潔 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]。

如果是個(gè)大類,那么需要很多個(gè) append 方法把這個(gè)大類的屬性放到 DiffBuilder 中,不太方便。可以寫個(gè)程序生成 DiffBuilder 初始化代碼,或者嘗試用反射來優(yōu)化這部分代碼。

反射擴(kuò)展:

(1)獲取對(duì)象所屬類的Class方法。

Class c = Class.forName("包.類名稱");

(2)獲得該類的所有Filed(不包括父類)。

Field[] fields = c.getDeclaredFields();

(3)將所有屬性的訪問權(quán)限設(shè)為true。

因?yàn)镴avaBean中所有的屬性訪問權(quán)限都是private,所以無法直接獲得所有屬性,因此我們必須獲得其訪問權(quán)限,通過下面的方法完成:

setAccessible(true);

(4)輸出對(duì)象屬性

f.getField(對(duì)象名稱);

(5)獲取字段名

fields[j].getName()

(6)獲取字段值

fields[j].get(obj)

參考資料

commons.apache.org/proper/comm

總結(jié)

到此這篇關(guān)于在Java中如何比較兩個(gè)對(duì)象的文章就介紹到這了,更多相關(guān)Java比較兩個(gè)對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法

    springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法

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

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

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

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

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

    Redisson可重入鎖解鎖邏輯詳細(xì)講解

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

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

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

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

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

    spring中@Autowired自動(dòng)注入依賴項(xiàng)的使用

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

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

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

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

    這篇文章主要介紹了SpringBoot整合Kaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    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對(duì)象類型,其實(shí)int就是Integer解包裝,Integer就是int的包裝,需要的朋友可以參考下
    2023-11-11

最新評(píng)論