亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

利用Lambda實(shí)現(xiàn)通過getter/setter方法引用拿到屬性名

MingjunYang / 1290人閱讀

摘要:很多開發(fā)場(chǎng)景需要用到的屬性名,直接寫死屬性名字符串的形式容易產(chǎn)生屬性名一旦變化,不會(huì)告訴你你的字符串需要同步修改。的可以通過方法引用簡(jiǎn)化代碼,同樣也可以通過的方法引用拿到屬性名,避免潛在的。

很多開發(fā)場(chǎng)景需要用到Java Bean的屬性名,直接寫死屬性名字符串的形式容易產(chǎn)生bug(屬性名一旦變化,IDE不會(huì)告訴你你的字符串需要同步修改)。JDK8的Lambda可以通過方法引用簡(jiǎn)化代碼,同樣也可以通過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 IGetter extends Serializable {
    Object apply(T source);
}
/**
 * setter方法接口定義
 */
@FunctionalInterface
public interface ISetter extends Serializable {
    void accept(T t, U u);
}
2. 定義getter/setter引用轉(zhuǎn)換屬性名的工具類
public class BeanUtils {
    ...
    /**
     * 緩存類-Lambda的映射關(guān)系
     */
    private static Map 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"));
    }
    
    /***
     * 獲取類對(duì)應(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;
    }
}
3. 開心的引用
String ITEM_NAME = BeanUtils.convertToFieldName(User::getOrgName);

Diboot - 簡(jiǎn)單高效的輕代碼開發(fā)框架

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/74790.html

相關(guān)文章

  • JavaScript || 對(duì)象

    摘要:通過對(duì)返回字符串切片第位到倒數(shù)第位即可獲得對(duì)象的類型。測(cè)試對(duì)象是的深拷貝是的子集,不能表示中所有值。序列化結(jié)果是,對(duì)象序列化結(jié)果是日期字符串不能表示函數(shù)對(duì)象和只能序列化對(duì)象自有的可枚舉屬性。 對(duì)象 對(duì)象是JavaScript的基本數(shù)據(jù)類型:屬性的無序集合。每個(gè)屬性key: value和屬性描述符descripter組成。 屬性名key:字符串或合法的變量標(biāo)識(shí)符; 屬性值value:...

    lavor 評(píng)論0 收藏0
  • 有關(guān)gettersetter的使用

    摘要:有以下中方式可以使用和對(duì)象初始化器關(guān)鍵字使用關(guān)鍵字為屬性添加一個(gè)函數(shù),函數(shù)名即為屬性名,函數(shù)不傳參,函數(shù)傳入的參數(shù)為設(shè)置對(duì)象的新值。需被定義或修改的屬性名。目前流行的框架的響應(yīng)式系統(tǒng)就是利用設(shè)置來追蹤數(shù)據(jù)變化,從而導(dǎo)致視圖更新。 什么是getter 和 setter ? getter: 讀取對(duì)象屬性時(shí)將被調(diào)用的函數(shù)。setter:設(shè)置對(duì)象屬性時(shí)被調(diào)用的函數(shù)。 有以下4中方式可以使用 s...

    SunZhaopeng 評(píng)論0 收藏0
  • 【js細(xì)節(jié)剖析】通過"="操作符為對(duì)象添加新屬性時(shí),結(jié)果會(huì)受到原型鏈上的同屬性

    摘要:在使用的過程中,通過操作符為對(duì)象添加新屬性是很常見的操作。但是,這個(gè)操作的結(jié)果實(shí)際上會(huì)受到原型鏈上的同名屬性影響。通過它,可以做到操作符做不到的事情,比如為對(duì)象設(shè)置一個(gè)新屬性,即使它的原型鏈上已經(jīng)有一個(gè)的同名屬性。 在使用JavaScript的過程中,通過=操作符為對(duì)象添加新屬性是很常見的操作:obj.newProp = value;。但是,這個(gè)操作的結(jié)果實(shí)際上會(huì)受到原型鏈上的同名屬性...

    wemallshop 評(píng)論0 收藏0
  • 封裝BeanMap以及java的反射和內(nèi)省

    摘要:所以,我實(shí)現(xiàn)了一個(gè)稱為的類來應(yīng)用反射?,F(xiàn)在流行的語(yǔ)言大都支持反射。這組內(nèi)省主要是針對(duì)類進(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包裝...

    張巨偉 評(píng)論0 收藏0
  • Lombok介紹、使用方法和總結(jié)

    摘要:使用方法能以簡(jiǎn)單的注解形式來簡(jiǎn)化代碼,提高開發(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...

    30e8336b8229 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<