最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在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)ⅲ琹hs 是當(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 簡短 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 簡潔 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)文章

  • Mybatis使用@Select注解sql中使用in問題

    Mybatis使用@Select注解sql中使用in問題

    這篇文章主要介紹了Mybatis使用@Select注解sql中使用in問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺談Spring的兩種配置容器

    淺談Spring的兩種配置容器

    這篇文章主要介紹了淺談Spring的兩種配置容器,介紹了其實(shí)現(xiàn)以及簡單的實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同

    java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同

    這篇文章主要介紹了java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 解讀JDK8踩坑JCE加密限制版本問題

    解讀JDK8踩坑JCE加密限制版本問題

    這篇文章主要介紹了JDK8踩坑JCE加密限制版本問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 使用spring.profiles.active來分區(qū)配置的方法示例

    使用spring.profiles.active來分區(qū)配置的方法示例

    這篇文章主要介紹了使用spring.profiles.active來分區(qū)配置的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • spring?batch線上異常定位記錄

    spring?batch線上異常定位記錄

    這篇文章主要為大家介紹了spring?batch線上異常定位記錄及異常解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)

    SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)

    Spring?Boot?對(duì)于?Spring?Security?提供了自動(dòng)化配置方案,可以使用更少的配置來使用?Spring?Security,這篇文章主要介紹了SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析,需要的朋友可以參考下
    2023-02-02
  • Java @Value(

    Java @Value("${xxx}")取properties時(shí)中文亂碼的解決

    這篇文章主要介紹了Java @Value("${xxx}")取properties時(shí)中文亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringAOP事務(wù)配置語法及實(shí)現(xiàn)過程詳解

    SpringAOP事務(wù)配置語法及實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了SpringAOP事務(wù)配置語法及實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 詳解JUC并發(fā)編程之鎖

    詳解JUC并發(fā)編程之鎖

    這篇文章主要為大家介紹了JUC并發(fā)編程之鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評(píng)論

大荔县| 柏乡县| 红桥区| 章丘市| 石台县| 馆陶县| 东辽县| 虹口区| 元氏县| 苏尼特右旗| 卢龙县| 咸阳市| 崇明县| 内江市| 二手房| 陆川县| 通海县| 称多县| 如东县| 阜新| 鞍山市| 津市市| 博野县| 天全县| 苍山县| 五华县| 屯门区| 天峻县| 宜章县| 博湖县| 古蔺县| 望奎县| 巫溪县| 滦南县| 岳西县| 沙河市| 温泉县| 达拉特旗| 湖口县| 株洲县| 松江区|