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

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

 更新時(shí)間:2020年04月28日 11:19:49   作者:liangwp  
這篇文章主要介紹了Java8通過(guò)Function獲取字段名,需要的朋友可以參考下

摘要: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, ?> 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

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

相關(guān)文章

  • java中Swing會(huì)奔跑的線程俠

    java中Swing會(huì)奔跑的線程俠

    本文通過(guò)代碼示例給大家詳細(xì)講解了java中Swing會(huì)奔跑的線程俠這個(gè)經(jīng)典的示例,有興趣的朋友學(xué)習(xí)下。
    2018-03-03
  • springboot聚合工程的部署與深入講解

    springboot聚合工程的部署與深入講解

    最近在寫一個(gè)商城,使用Maven聚合工程來(lái)管理,但是其中搭建環(huán)境遇見(jiàn)了各種的坑,下面這篇文章主要給大家介紹了關(guān)于springboot聚合工程部署的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 關(guān)于spring的自定義緩存注解分析

    關(guān)于spring的自定義緩存注解分析

    這篇文章主要介紹了關(guān)于spring的自定義緩存注解分析,因?yàn)樗械膋ey的失效時(shí)間都一樣,要想實(shí)現(xiàn)不同的key不同的失效時(shí)間,就得需要自定義緩存注解,需要的朋友可以參考下
    2023-05-05
  • Spring?AOP利用切面實(shí)現(xiàn)日志保存的示例詳解

    Spring?AOP利用切面實(shí)現(xiàn)日志保存的示例詳解

    最近領(lǐng)導(dǎo)讓寫個(gè)用切面實(shí)現(xiàn)日志保存,經(jīng)過(guò)調(diào)研和親測(cè),以完美解決。在這里分享給大家,給有需要的碼友直接使用,希望對(duì)大家有所幫助
    2022-11-11
  • Springboot整合activemq的方法步驟

    Springboot整合activemq的方法步驟

    這篇文章主要介紹了Springboot整合activemq的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • springboot內(nèi)嵌Tomcat安全漏洞修復(fù)方式

    springboot內(nèi)嵌Tomcat安全漏洞修復(fù)方式

    針對(duì)CVE-2020-1938漏洞,建議升級(jí)Tomcat至安全版本以避免受影響,影響版本包括:Apache Tomcat 9.x小于9.0.31、Apache Tomcat 8.x小于8.5.51、Apache Tomcat 7.x小于7.0.100及Apache Tomcat 6.x,
    2024-10-10
  • JDBC環(huán)境設(shè)置(中文詳解)

    JDBC環(huán)境設(shè)置(中文詳解)

    要開(kāi)始使用JDBC設(shè)置,按照以下所示的步驟開(kāi)發(fā)JDBC環(huán)境。以下內(nèi)容假設(shè)Windows平臺(tái)上
    2014-03-03
  • mybatis?對(duì)于生成的sql語(yǔ)句?自動(dòng)加上單引號(hào)的情況詳解

    mybatis?對(duì)于生成的sql語(yǔ)句?自動(dòng)加上單引號(hào)的情況詳解

    這篇文章主要介紹了mybatis?對(duì)于生成的sql語(yǔ)句?自動(dòng)加上單引號(hào)的情況詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • IDEA2021安裝及常用功能設(shè)置

    IDEA2021安裝及常用功能設(shè)置

    這篇文章主要介紹了IDEA2021安裝及常用功能設(shè)置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問(wèn)題及解決

    IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問(wèn)題及解決

    這篇文章主要介紹了IDEA啟動(dòng)Tomcat時(shí)控制臺(tái)出現(xiàn)亂碼問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評(píng)論

昌黎县| 廊坊市| 宁陕县| 永宁县| 甘孜县| 南华县| 阿坝| 黑河市| 津南区| 开鲁县| 磐安县| 扬州市| 锡林浩特市| 北京市| 石门县| 天柱县| 新宁县| 塘沽区| 万山特区| 望谟县| 万宁市| 克什克腾旗| 浦北县| 巨鹿县| 城口县| 大城县| 南皮县| 北票市| 涪陵区| 宝清县| 嵩明县| 维西| 张家港市| 兰州市| 库伦旗| 东宁县| 宁远县| 临沧市| 清远市| 清镇市| 四子王旗|