千家信息网

Java8如何通过Function获取字段名

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,小编给大家分享一下Java8如何通过Function获取字段名,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法一:声明
千家信息网最后更新 2025年01月19日Java8如何通过Function获取字段名

小编给大家分享一下Java8如何通过Function获取字段名,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

方法一:

声明 String key1="aaa"; key为 key1,value 为map.get(key1);

Map 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 extends Function, Serializable {    }    /**     * 字段名注解,声明表字段     */    @Target(ElementType.FIELD)    @Retention(RetentionPolicy.RUNTIME)    public @interface TableField {        String value() default "";    }    //默认配置    static String defaultSplit = "";    static Integer defaultToType = 0;    /**     * 获取实体类的字段名称(实体声明的字段名称)     */    public static  String getFieldName(SFunction fn) {        return getFieldName(fn, defaultSplit);    }    /**     * 获取实体类的字段名称     * @param split 分隔符,多个字母自定义分隔符     */    public static  String getFieldName(SFunction fn, String split) {        return getFieldName(fn, split, defaultToType);    }    /**     * 获取实体类的字段名称     * @param split 分隔符,多个字母自定义分隔符     * @param toType 转换方式,多个字母以大小写方式返回 0.不做转换 1.大写 2.小写     */    public static  String getFieldName(SFunction 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  SerializedLambda getSerializedLambda(SFunction 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获取字段名"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0