91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8如何通過Function獲取字段名

發布時間:2021-09-29 13:33:24 來源:億速云 閱讀:254 作者:小新 欄目:開發技術

小編給大家分享一下Java8如何通過Function獲取字段名,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

方法一:

聲明 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);

然后好像日常使用中也沒有其他的方法了,下面將帶來另外一種使用方法,話不多說直接上代碼[/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通過Function函數獲取字段名稱(獲取實體類的字段名稱)
 * @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 "";
    }

    //默認配置
    static String defaultSplit = "";
    static Integer defaultToType = 0;

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

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

    /**
     * 獲取實體類的字段名稱
     * @param split 分隔符,多個字母自定義分隔符
     * @param toType 轉換方式,多個字母以大小寫方式返回 0.不做轉換 1.大寫 2.小寫
     */
    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取出字段名,可以根據實際情況調整
        TableField tableField = field.getAnnotation(TableField.class);
        if (tableField != null && tableField.value().length() > 0) {
            return tableField.value();
        } else {

            //0.不做轉換 1.大寫 2.小寫
            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;
    }


    /**
     * 測試用戶實體類
     */
    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) {

        //實體類原字段名稱返回
        System.out.println();
        System.out.println("實體類原字段名稱返回");
        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("實體類字段名稱增加分隔符");
        System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_"));

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


    }

}

輸出結果:

Java8如何通過Function獲取字段名

以上是“Java8如何通過Function獲取字段名”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寿宁县| 阜南县| 永和县| 镶黄旗| 财经| 达拉特旗| 呼玛县| 郯城县| 德化县| 孟州市| 东平县| 获嘉县| 丰县| 思茅市| 公主岭市| 若尔盖县| 淮南市| 色达县| 体育| 客服| 额济纳旗| 广饶县| 浦城县| 三门县| 佳木斯市| 桦南县| 长岭县| 荥阳市| 高唐县| 溧水县| 山阴县| 朝阳区| 阳山县| 灵璧县| 孟村| 百色市| 肇源县| 平利县| 平度市| 台南市| 宿州市|