软件编程
位置:首页>> 软件编程>> java编程>> Java8通过Function获取字段名的方法(获取实体类的字段名称)

Java8通过Function获取字段名的方法(获取实体类的字段名称)

作者:一抹微笑~  发布时间:2021-05-23 12:24:19 

标签:Java8,Function,字段名

看似很鸡肋其实在某些特殊场景还是比较有用的。
比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个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);

然后好像日常使用中也没有其他的方法了,下面将带来另外一种使用方法,话不多说直接上代码[/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获取字段名的方法(获取实体类的字段名称)

来源:https://www.cnblogs.com/IT-study/p/15351980.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com