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

Java8通過(guò)Function獲取字段名的方法(獲取實(shí)體類(lèi)的字段名稱)

 更新時(shí)間:2021年09月29日 11:36:43   作者:一抹微笑~  
Java8通過(guò)Function獲取字段名。不用再硬編碼,效果類(lèi)似于mybatis-plus的LambdaQueryWrapper,對(duì)Java8通過(guò)Function獲取字段名相關(guān)知識(shí)感興趣的朋友一起看看吧

看似很雞肋其實(shí)在某些特殊場(chǎng)景還是比較有用的。
比如你將實(shí)體類(lèi)轉(zhuǎn)Map或者拿到一個(gè)Map結(jié)果的時(shí)候,你是怎么獲取某個(gè)map的key和value。

方法一:

聲明 String key1="aaa"; key為 key1,value 為map.get(key1);

Map<String,Object> map=new HashMap<>();
        map.put("aaa",1);

        //獲取map的key 和value
        //key 為key1
        String key1="aaa";
        //value 為 map.get(key1)
        map.get(key1);

然后好像日常使用中也沒(méi)有其他的方法了,下面將帶來(lái)另外一種使用方法,話不多說(shuō)直接上代碼[/code]

import java.io.Serializable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Function;

/**
 * Java8通過(guò)Function函數(shù)獲取字段名稱(獲取實(shí)體類(lèi)的字段名稱)
 * @see ColumnUtil#main(java.lang.String[]) 使用示例
 * @author jx
 */
public class ColumnUtil {

    /**
     * 使Function獲取序列化能力
     */
    @FunctionalInterface
    public interface SFunction<T, R> extends Function<T, R>, Serializable {
    }

    /**
     * 字段名注解,聲明表字段
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TableField {
        String value() default "";
    }

    //默認(rèn)配置
    static String defaultSplit = "";
    static Integer defaultToType = 0;

    /**
     * 獲取實(shí)體類(lèi)的字段名稱(實(shí)體聲明的字段名稱)
     */
    public static <T> String getFieldName(SFunction<T, ?> fn) {
        return getFieldName(fn, defaultSplit);
    }

    /**
     * 獲取實(shí)體類(lèi)的字段名稱
     * @param split 分隔符,多個(gè)字母自定義分隔符
     */
    public static <T> String getFieldName(SFunction<T, ?> fn, String split) {
        return getFieldName(fn, split, defaultToType);
    }

    /**
     * 獲取實(shí)體類(lèi)的字段名稱
     * @param split 分隔符,多個(gè)字母自定義分隔符
     * @param toType 轉(zhuǎn)換方式,多個(gè)字母以大小寫(xiě)方式返回 0.不做轉(zhuǎn)換 1.大寫(xiě) 2.小寫(xiě)
     */
    public static <T> String getFieldName(SFunction<T, ?> fn, String split, Integer toType) {
        SerializedLambda serializedLambda = getSerializedLambda(fn);

        // 從lambda信息取出method、field、class等
        String fieldName = serializedLambda.getImplMethodName().substring("get".length());
        fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase());
        Field field;
        try {
            field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName);
        } catch (ClassNotFoundException | NoSuchFieldException e) {
            throw new RuntimeException(e);
        }

        // 從field取出字段名,可以根據(jù)實(shí)際情況調(diào)整
        TableField tableField = field.getAnnotation(TableField.class);
        if (tableField != null && tableField.value().length() > 0) {
            return tableField.value();
        } else {

            //0.不做轉(zhuǎn)換 1.大寫(xiě) 2.小寫(xiě)
            switch (toType) {
                case 1:
                    return fieldName.replaceAll("[A-Z]", split + "$0").toUpperCase();
                case 2:
                    return fieldName.replaceAll("[A-Z]", split + "$0").toLowerCase();
                default:
                    return fieldName.replaceAll("[A-Z]", split + "$0");
            }

        }

    }

    private static <T> SerializedLambda getSerializedLambda(SFunction<T, ?> fn) {
        // 從function取出序列化方法
        Method writeReplaceMethod;
        try {
            writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }

        // 從序列化方法取出序列化的lambda信息
        boolean isAccessible = writeReplaceMethod.isAccessible();
        writeReplaceMethod.setAccessible(true);
        SerializedLambda serializedLambda;
        try {
            serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        writeReplaceMethod.setAccessible(isAccessible);
        return serializedLambda;
    }


    /**
     * 測(cè)試用戶實(shí)體類(lèi)
     */
    public static class TestUserDemo implements Serializable {

        private static final long serialVersionUID = 1L;

        private String loginName;
        private String name;
        private String companySimpleName;

        @ColumnUtil.TableField("nick")
        private String nickName;

        public String getLoginName() {
            return loginName;
        }

        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }

        public String getNickName() {
            return nickName;
        }

        public void setNickName(String nickName) {
            this.nickName = nickName;
        }

        public static long getSerialVersionUID() {
            return serialVersionUID;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getCompanySimpleName() {
            return companySimpleName;
        }

        public void setCompanySimpleName(String companySimpleName) {
            this.companySimpleName = companySimpleName;
        }
    }


    /**
     * 參考示例
     */
    public static void main(String[] args) {

        //實(shí)體類(lèi)原字段名稱返回
        System.out.println();
        System.out.println("實(shí)體類(lèi)原字段名稱返回");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getLoginName));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getNickName));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName));

        System.out.println();
        System.out.println("實(shí)體類(lèi)字段名稱增加分隔符");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_"));

        System.out.println();
        System.out.println("實(shí)體類(lèi)字段名稱增加分隔符 + 大小寫(xiě)");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 0));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 1));
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 2));


    }

}

輸出結(jié)果:

到此這篇關(guān)于Java8通過(guò)Function獲取字段名(獲取實(shí)體類(lèi)的字段名稱)的文章就介紹到這了,更多相關(guān)Java8通過(guò)Function獲取字段名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Mybatis的二級(jí)緩存配置

    詳解Mybatis的二級(jí)緩存配置

    這篇文章主要介紹了Mybatis的二級(jí)緩存配置的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Mybatis-Plus?sum聚合函數(shù)及按日期查詢并求和的方式詳解

    Mybatis-Plus?sum聚合函數(shù)及按日期查詢并求和的方式詳解

    這篇文章主要介紹了Mybatis-Plus sum聚合函數(shù)及按日期查詢并求和,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java中Date,Calendar,Timestamp的區(qū)別以及相互轉(zhuǎn)換與使用

    Java中Date,Calendar,Timestamp的區(qū)別以及相互轉(zhuǎn)換與使用

    以下是對(duì)Java中Date,Calendar,Timestamp的區(qū)別以及相互轉(zhuǎn)換與使用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java GZIPOutputStream流壓縮文件的操作

    Java GZIPOutputStream流壓縮文件的操作

    這篇文章主要介紹了Java GZIPOutputStream流壓縮文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • springboot?yml配置文件值注入方式

    springboot?yml配置文件值注入方式

    這篇文章主要介紹了springboot?yml配置文件值注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 使用Java7的Files工具類(lèi)和Path接口來(lái)訪問(wèn)文件的方法

    使用Java7的Files工具類(lèi)和Path接口來(lái)訪問(wèn)文件的方法

    下面小編就為大家分享一篇使用Java7的Files工具類(lèi)和Path接口來(lái)訪問(wèn)文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 淺談Spring如何解決循環(huán)依賴的問(wèn)題

    淺談Spring如何解決循環(huán)依賴的問(wèn)題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Spring中自動(dòng)裝配的4種方式

    Spring中自動(dòng)裝配的4種方式

    今天小編就為大家分享一篇關(guān)于Spring中自動(dòng)裝配的4種方式,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • SpringCloud使用Feign文件上傳、下載

    SpringCloud使用Feign文件上傳、下載

    這篇文章主要為大家詳細(xì)介紹了SpringCloud使用Feign文件上傳、下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論

旬阳县| 固始县| 辽宁省| 绥芬河市| 屏边| 嫩江县| 天等县| 同心县| 和林格尔县| 青州市| 新宁县| 涟源市| 彭阳县| 崇州市| 雅江县| 高碑店市| 将乐县| 垦利县| 莱西市| 株洲县| 罗定市| 兖州市| 新蔡县| 齐齐哈尔市| 崇信县| 彭州市| 平安县| 新兴县| 隆德县| 涿州市| 崇文区| 封丘县| 栾城县| 佛山市| 桂林市| 漠河县| 达孜县| 昌图县| 蕲春县| 三门县| 巴东县|