摘要:然后告訴同事我寫好了,讓他幫忙優(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 staticT 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 staticT 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
近期在維護公司項目的時候遇到一個問題,因為實體類中的 set 方法涉及到了業(yè)務(wù)邏輯,因此在給對象賦值的過程中不能夠使用 set 方法,為了實現(xiàn)功能,所以采用了反射的機制給對象屬性賦值,借此機會也了解了反射的一些具體用法和使用場景,分以下兩點對反射進(jìn)行分析: 反射的優(yōu)勢和劣勢 反射的應(yīng)用場景 反射的優(yōu)勢和劣勢 ??個人理解,反射機制實際上就是上帝模式,如果說方法的調(diào)用是 Java 正確的打開方式...
摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...
閱讀 1660·2021-11-16 11:41
閱讀 2458·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09