国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用Java的反射機制,將一個實體類所有字段賦值為null

Thanatos / 1965人閱讀

摘要:然后告訴同事我寫好了,讓他幫忙優(yōu)化一下畢竟他在我心里是一個真正的大牛,午休結(jié)束后,他發(fā)來了兩個方法給我,以不同的方式實現(xiàn),不過都是基于反射機制。

如何將一個實體類的所有字段設(shè)置為null

起因:在我們想要使用一個實體類的時候,如果發(fā)現(xiàn)創(chuàng)建這個類的時候,給某一些字段設(shè)置了初始值(某些場景下的特殊需要),但我們這個時候又不需要這些初始化值的時候,我們就會想要把這些值全部清除掉,讓其變?yōu)橐粋€干凈的類,我們可以手動一個一個去賦null值,我一開始就是這么做的,同事看到后告訴我,你可以嘗試使用反射機制,自己封裝一個工具類,這樣大家都可以使用,于是我就這么做了,也就有了下面比較low B 的代碼:

我的代碼:

public static void reflectClassValueToNull(Object model) throws Exception {
        
        //獲取此類的所有父類
        List> listSuperClass = Lists.newArrayList();
        Class superclass = model.getClass().getSuperclass();
        while (superclass != null) {
            if (superclass.getName().equals("java.lang.Object")) {
                break;
            }
            listSuperClass.add(superclass);
            superclass = superclass.getSuperclass();
        }

        //遍歷處理所有父類的字段
        for (Class clazz : listSuperClass) {
            Field[] fields = clazz.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                String name = fields[i].getName();
                Class type = fields[i].getType();
                Method method = clazz.getMethod("set" + name.replaceFirst(name.substring(0, 1),
                        name.substring(0, 1).toUpperCase()), type);
                method.invoke(model, new Object[]{null});
            }
        }

        //處理此類自己的字段
        Field[] fields = model.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            String name = fields[i].getName();
            Class type = fields[i].getType();
            //獲取屬性的set方法
            Method method = model.getClass().getMethod("set" + name.replaceFirst(name.substring(0, 1),
                    name.substring(0, 1).toUpperCase()), type);
            //將值設(shè)為null
            method.invoke(model, new Object[]{null});
        }
    }
代碼寫完的那一刻,真的很爽,雖然這個東西比較簡單,但還是有一點成就感。然后告訴同事我寫好了,讓他幫忙優(yōu)化一下(畢竟他在我心里是一個真正的大牛),午休結(jié)束后,他發(fā)來了兩個方法給我,以不同的方式實現(xiàn),不過都是基于反射機制。以下是他的代碼:

第一個種方法:

public static  T byMethod(T t) {
        ReflectionUtils.getAllMethods(t.getClass(), method -> Objects.requireNonNull(method).getName().indexOf("set") == 0).forEach(method -> {
            try {
                method.invoke(t, new Object[]{null});
            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        });
        return t;
    }

第二種方法:

public static  T byField(T t) {
        ReflectionUtils.getAllFields(t.getClass()).forEach(field -> {
            try {
                field.setAccessible(true);
                field.set(t, null);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        });
        return t;
    }

所以,差距你們看到了嗎?反正我看到了!寫到這里,也就結(jié)束了,如果對你們有所幫助,我很開心,沒有,也感謝你們很有耐心的看到這里。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68151.html

相關(guān)文章

  • Reflection:Java反射機制應(yīng)用場景

    近期在維護公司項目的時候遇到一個問題,因為實體類中的 set 方法涉及到了業(yè)務(wù)邏輯,因此在給對象賦值的過程中不能夠使用 set 方法,為了實現(xiàn)功能,所以采用了反射的機制給對象屬性賦值,借此機會也了解了反射的一些具體用法和使用場景,分以下兩點對反射進(jìn)行分析: 反射的優(yōu)勢和劣勢 反射的應(yīng)用場景 反射的優(yōu)勢和劣勢 ??個人理解,反射機制實際上就是上帝模式,如果說方法的調(diào)用是 Java 正確的打開方式...

    浠ラ箍 評論0 收藏0
  • java反射

    摘要:反射概念反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法對于任意一個對象,都能夠調(diào)用它的任意方法和屬性這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為語言的反射機制。 java反射概念 JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能...

    IntMain 評論0 收藏0
  • MyBatis初步

    摘要:本章主要介紹的是的基礎(chǔ)應(yīng)用和源碼涉及的相關(guān)等,主要包含的內(nèi)容有的簡介反射動態(tài)代理包含代理和代理使用和代碼生成器等。組件生命周期,如圖測試代碼生成器代碼生成器,又稱逆向工程。 本章主要介紹的是MyBatis的基礎(chǔ)應(yīng)用和源碼涉及的相關(guān)等,主要包含的內(nèi)容有MyBatis的簡介、反射、動態(tài)代理(包含JDK代理和cglib代理)、MyBatis使用和代碼生成器等。 1.1 MyBatis簡介 M...

    MASAILA 評論0 收藏0
  • 最最最常見Java面試題總結(jié)——第二周

    摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

Thanatos

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<