溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java8如何通過(guò)Function獲取字段名的步驟

發(fā)布時(shí)間:2020-07-29 14:13:44 來(lái)源:億速云 閱讀:392 作者:小豬 欄目:編程語(yǔ)言

這篇文章主要講解了Java8如何通過(guò)Function獲取字段名的步驟,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

摘要:Java8通過(guò)Function獲取字段名,解決硬編碼,效果類似于mybatis-plus的LambdaQueryWrapper。

本文總共三個(gè)步驟:
1、使Function獲取序列化能力;
2、通過(guò)SFunction獲取字段名;
3、建一些業(yè)務(wù)代碼進(jìn)行測(cè)試;

使Function獲取序列化能力

import java.io.Serializable;
import java.util.function.Function;

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

通過(guò)SFunction獲取字段名

import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ColumnUtil {

  public static <T> String getName(SFunction<T, &#63;> 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);

    // 從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 {
      return fieldName.replaceAll("[A-Z]", "_$0").toLowerCase();
    }
  }
}

建一些業(yè)務(wù)代碼進(jìn)行測(cè)試

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 字段名注解。測(cè)試用
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableField {
  String value() default "";
}
import java.io.Serializable;

/**
 * 用戶實(shí)體類。測(cè)試用
 */
public class User implements Serializable {

  private String loginName;

  @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;
  }
}
/**
 * 測(cè)試用
 */
public class Test {
  public static void main(String[] args) {
    System.out.println("字段名:" + ColumnUtil.getName(User::getLoginName));
    System.out.println("字段名:" + ColumnUtil.getName(User::getNickName));
  }
}

運(yùn)行結(jié)果:

字段名:login_name
字段名:nick

看完上述內(nèi)容,是不是對(duì)Java8如何通過(guò)Function獲取字段名的步驟有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI