摘要:很多開發(fā)場景需要用到的屬性名,直接寫死屬性名字符串的形式容易產(chǎn)生屬性名一旦變化,不會(huì)告訴你你的字符串需要同步修改。的可以通過方法引用簡化代碼,同樣也可以通過的方法引用拿到屬性名,避免潛在的。
很多開發(fā)場景需要用到Java Bean的屬性名,直接寫死屬性名字符串的形式容易產(chǎn)生bug(屬性名一旦變化,IDE不會(huì)告訴你你的字符串需要同步修改)。JDK8的Lambda可以通過方法引用簡化代碼,同樣也可以通過getter/setter的方法引用拿到屬性名,避免潛在的bug。期望實(shí)現(xiàn)效果
// 傳統(tǒng)方式:hard code寫死屬性名 // String ITEM_NAME = "orgName"; // 方法引用:替代hard code字符串,當(dāng)屬性名變化時(shí)IDE會(huì)同步提示,避免未同步產(chǎn)生bug String ITEM_NAME = BeanUtils.convertToFieldName(User::getOrgName);具體實(shí)現(xiàn)代碼封裝 1. 定義FunctionalInterface 接收方法引用
/** * getter方法接口定義 */ @FunctionalInterface public interface IGetter2. 定義getter/setter引用轉(zhuǎn)換屬性名的工具類extends Serializable { Object apply(T source); } /** * setter方法接口定義 */ @FunctionalInterface public interface ISetter extends Serializable { void accept(T t, U u); }
public class BeanUtils { ... /** * 緩存類-Lambda的映射關(guān)系 */ private static Map3. 開心的引用CLASS_LAMDBA_CACHE = new ConcurrentHashMap<>(); /*** * 轉(zhuǎn)換方法引用為屬性名 * @param fn * @return */ public static String convertToFieldName(IGetter fn) { SerializedLambda lambda = getSerializedLambda(fn); String methodName = lambda.getImplMethodName(); String prefix = null; if(methodName.startsWith("get")){ prefix = "get"; } else if(methodName.startsWith("is")){ prefix = "is"; } if(prefix == null){ log.warn("無效的getter方法: "+methodName); } // 截取get/is之后的字符串并轉(zhuǎn)換首字母為小寫(S為diboot項(xiàng)目的字符串工具類,可自行實(shí)現(xiàn)) return S.uncapFirst(S.substringAfter(methodName, prefix)); } /*** * 轉(zhuǎn)換setter方法引用為屬性名 * @param fn * @return */ public static String convertToFieldName(ISetter fn) { SerializedLambda lambda = getSerializedLambda(fn); String methodName = lambda.getImplMethodName(); if(!methodName.startsWith("set")){ log.warn("無效的setter方法: "+methodName); } // 截取set之后的字符串并轉(zhuǎn)換首字母為小寫(S為diboot項(xiàng)目的字符串工具類,可自行實(shí)現(xiàn)) return S.uncapFirst(S.substringAfter(methodName, "set")); } /*** * 獲取類對應(yīng)的Lambda * @param fn * @return */ private static SerializedLambda getSerializedLambda(Serializable fn){ //先檢查緩存中是否已存在 SerializedLambda lambda = CLASS_LAMDBA_CACHE.get(fn.getClass()); if(lambda == null){ try{//提取SerializedLambda并緩存 Method method = fn.getClass().getDeclaredMethod("writeReplace"); method.setAccessible(Boolean.TRUE); lambda = (SerializedLambda) method.invoke(fn); CLASS_LAMDBA_CACHE.put(fn.getClass(), lambda); } catch (Exception e){ log.error("獲取SerializedLambda異常, class="+fn.getClass().getSimpleName(), e); } } return lambda; } }
String ITEM_NAME = BeanUtils.convertToFieldName(User::getOrgName);
Diboot - 簡單高效的輕代碼開發(fā)框架
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74790.html
摘要:通過對返回字符串切片第位到倒數(shù)第位即可獲得對象的類型。測試對象是的深拷貝是的子集,不能表示中所有值。序列化結(jié)果是,對象序列化結(jié)果是日期字符串不能表示函數(shù)對象和只能序列化對象自有的可枚舉屬性。 對象 對象是JavaScript的基本數(shù)據(jù)類型:屬性的無序集合。每個(gè)屬性key: value和屬性描述符descripter組成。 屬性名key:字符串或合法的變量標(biāo)識符; 屬性值value:...
摘要:有以下中方式可以使用和對象初始化器關(guān)鍵字使用關(guān)鍵字為屬性添加一個(gè)函數(shù),函數(shù)名即為屬性名,函數(shù)不傳參,函數(shù)傳入的參數(shù)為設(shè)置對象的新值。需被定義或修改的屬性名。目前流行的框架的響應(yīng)式系統(tǒng)就是利用設(shè)置來追蹤數(shù)據(jù)變化,從而導(dǎo)致視圖更新。 什么是getter 和 setter ? getter: 讀取對象屬性時(shí)將被調(diào)用的函數(shù)。setter:設(shè)置對象屬性時(shí)被調(diào)用的函數(shù)。 有以下4中方式可以使用 s...
摘要:在使用的過程中,通過操作符為對象添加新屬性是很常見的操作。但是,這個(gè)操作的結(jié)果實(shí)際上會(huì)受到原型鏈上的同名屬性影響。通過它,可以做到操作符做不到的事情,比如為對象設(shè)置一個(gè)新屬性,即使它的原型鏈上已經(jīng)有一個(gè)的同名屬性。 在使用JavaScript的過程中,通過=操作符為對象添加新屬性是很常見的操作:obj.newProp = value;。但是,這個(gè)操作的結(jié)果實(shí)際上會(huì)受到原型鏈上的同名屬性...
摘要:所以,我實(shí)現(xiàn)了一個(gè)稱為的類來應(yīng)用反射。現(xiàn)在流行的語言大都支持反射。這組內(nèi)省主要是針對類進(jìn)行操作的,能夠獲取類的屬性信息。可以看到,通過的內(nèi)省機(jī)制,解決了的最關(guān)鍵的問題。在封裝反射的時(shí)候,會(huì)充分考慮到各種情況。 BeanMap 學(xué)習(xí)具體的技術(shù)工具的好辦法就是些Demo、造輪子。所以,我實(shí)現(xiàn)了一個(gè)稱為BeanMap的類來應(yīng)用java反射API。 這個(gè)BeanMap的功能是將一個(gè)Bean包裝...
摘要:使用方法能以簡單的注解形式來簡化代碼,提高開發(fā)人員的開發(fā)效率。能通過注解的方式,在編譯時(shí)自動(dòng)為屬性生成構(gòu)造器方法。出現(xiàn)的神奇就是在源碼中沒有和方法,但是在編譯生成的字節(jié)碼文件中有和方法。沒法實(shí)現(xiàn)多種參數(shù)構(gòu)造器的重載。 1 Lombok背景介紹 官方介紹如下: Project Lombok makes java a spicier language by addi...
閱讀 2756·2023-04-26 02:28
閱讀 2607·2021-09-27 13:36
閱讀 3156·2021-09-03 10:29
閱讀 2803·2021-08-26 14:14
閱讀 2131·2019-08-30 15:56
閱讀 872·2019-08-29 13:46
閱讀 2636·2019-08-29 13:15
閱讀 479·2019-08-29 11:29