java 返回function_Java8通过Function获取字段名

2023-11-11

摘要:Java8通过Function获取字段名。不用再硬编码,效果类似于mybatis-plus的LambdaQueryWrapper。

本文总共三个步骤:

1、使Function获取序列化能力;

2、通过SFunction获取字段名;

3、建一些业务代码进行测试;

使Function获取序列化能力

import java.io.Serializable;

import java.util.function.Function;

/**

* 使Function获取序列化能力

*/

@FunctionalInterface

public interface SFunction extends Function, Serializable {

}

通过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 String getName(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);

// 从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 {

return fieldName.replaceAll("[A-Z]", "_$0").toLowerCase();

}

}

}

建一些业务代码进行测试

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 字段名注解。测试用

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface TableField {

String value() default "";

}

import java.io.Serializable;

/**

* 用户实体类。测试用

*/

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;

}

}

/**

* 测试用

*/

public class Test {

public static void main(String[] args) {

System.out.println("字段名:" + ColumnUtil.getName(User::getLoginName));

System.out.println("字段名:" + ColumnUtil.getName(User::getNickName));

}

}

运行结果:

字段名:login_name

字段名:nick

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 返回function_Java8通过Function获取字段名 的相关文章

  • React - 路由 lazyLoad 的使用(路由懒加载)

    React 路由 lazyLoad 路由懒加载 lazy是React提供的懒 动态 加载组件的方法 React lazy 路由组件代码会被分开打包 能减少打包体积 延迟加载首屏不需要渲染的组件 依赖内置组件Suspense标签的fallba
  • scau oj 10848 2021-11-06

    18048 自由落体 时间限制 1000MS 代码长度限制 10KB 提交次数 0 通过次数 0 题型 编程题 语言 G GCC VC Description 一个球从100米的高度自由落下 每次落地后弹起的原来高度的一半 计算并输出第n次
  • 海思3861环境搭建

    开发环境 ubuntu18 04 DOPI3861开发板 Q群 735884031 一 安装编译工具 1 按照官方文档下载编译工具并添加到环境变量中 https device harmonyos com cn docs start intr
  • spring boot logback 配置

    为什么要使用logback 在开发中不建议使用System out因为大量的使用会增加资源的消耗 因为使用System out是在当前线程执行的 写入文件也是写入完毕之后才继续执行下面的程序 而使用Log工具不但可以控制日志是否输出 怎么输
  • git 合并不提交

    1 默认情况 默认合并 会执行commit 查看日志信息会有commit日志 2 合并不提交 勾选下面两个复选框 查看日志时 就不会有默认提交了 执行提交命令时 就会出现合并后的文件
  • Acwing 3. 完全背包问题

    暴力解法 完全背包每种物品都有无限个可用 include
  • elementui表格自定义表头的两种方法

    表格自定义表头的方式 多选框表头换文字 请查看上篇博客 http t csdn cn 69De2 文字换按钮 render header render header方法详情 Table column Attributes 参数 说明 类型
  • 时序预测

    MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 目录 MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 效果一览 基本介绍 模型搭建 程序设计 学习总结 往期精彩 参考资料 效果一览 基本介绍 MATL
  • 苹果系统itunes连iphone连不上服务器,iphone连不上itunes怎么办,iphone连不上itunes的解决办法...

    iPhone连不上iTunes怎么办 苹果手机连接不上iTunes的解决方法 iPhone手机虽然比较贵 但是使用的人也不少 作为一款区别于安卓系统的手机 它拥有更流畅的系统和更好的体验 但是有些果粉平时在操作手机时 有时需要通过连接itu
  • java/php/net/python网上订餐系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 系统体系结构 网上订餐系统的结构图4 1所示 图4 1 系统结构 登录系统结构图
  • HashMap的扩容机制

    目录 一 HashMap的底层 二 HashMap的扩容机制原理 1 JDK1 7版本扩容 2 JDK1 8版本扩容 三 HashMap底层JDK1 7到JDK1 8的变化 一 HashMap的底层 底层 采用数组 链表 JDK1 7 采用
  • slam十四讲 _直接法

    视觉里程计 直接法是视觉里程计另一主要分支 它与特征点法有很大不同 虽然它还没有成为现 在 VO 中的主流 但经过近几年的发展 直接法在一定程度上已经能和特征点法平分秋色 特征点法的缺点 关键点的提取与描述子的计算非常耗时 使用特征点时 忽
  • 有序统计恒虚警检测(OS-CFAR)算法的MATLAB代码

    有序统计恒虚警检测 OS CFAR 算法的MATLAB代码 有序统计恒虚警检测 Ordered Statistic Constant False Alarm Rate OS CFAR 是一种常用的雷达信号处理算法 用于检测雷达回波中的目标信
  • TencentOS-tiny 任务间通信(八)- 消息队列

    一 任务间通信 消息队列 概述 消息队列提供了任务间传递指针数据的机制 所谓的 消息 就是指针 消息本身如何解析使用 由传递消息的两个任务自行规定 消息队列不对消息本身做任何规定和限制 消息队列仅承担指针数据的传递义务 API讲解 编程实例
  • uniapp截取数组中的前几项

  • Netty Client 重连实现

    当我们用Netty实现一个TCP client时 我们当然希望当连接断掉的时候Netty能够自动重连 Netty Client有两种情况下需要重连 Netty Client启动的时候需要重连 在程序运行中连接断掉需要重连 对于第一种情况 N
  • 浏览器事件循环机制与Vue nextTick的实现

    浏览器事件循环机制 先上一段简单的代码 console log aa setTimeout gt console log bb 0 Promise resolve then gt console log cc 复制代码 执行结果总是如下 a
  • mariadb实现服务器的数据分库-主从同步

    mariadb实现服务器的数据主从同步1 主从同步配置原理2 使用mariadb实现主从同步 mariadb实现服务器的数据分库 主从同步 1 主从同步配置原理 mariadb主从复制中 第一步 master记录二进制日志 在每个事务更新数
  • C语言之基本算法15—前三位和后三位都是完全平方数的六位完全平方数

    题目 一个六位数是完全平方数 前三位和后三位都是完全平方数 求该三平方数 include

随机推荐

  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

    目录 1 算法理论概述 2 部分核心程序 3 算法运行软件版本 4 算法运行效果图预览 5 算法完整程序工程 1 算法理论概述 情绪识别是一种重要的情感分析任务 旨在从文本 语音或图像等数据中识别出人的情绪状态 如高兴 悲伤 愤怒等 本文介
  • web服务器的简单运用,搭建一个满足些许功能的网站

    实验 搭建一个名为openlab的web网站 网站需求 1 基于域名 www openlab com 可以访问网站内容为 welcom to openlab 2 给该公司创建三个子界面分别显示学生信息 教学资料和缴费网站 基于www ope
  • 数据流式传输_在Android上使用rxjava从家庭影院设备流式传输数据

    数据流式传输 介绍 Introduction In my initial blog post around building an Android companion app for my NAD home cinema receiver
  • LLVM教程(二)-- LLVM的安装

    1 下载CMake版本 https cmake org download 下载的CMake版本必须大于 Version 3 4 3 注如果系统中已经有CMake了通过 cmake version 查看一下版本号 大于就不用下载了 lt 1
  • Windows10 安装 Texlive2019 和 Texstudio

    文章目录 texlive2019的下载与安装 1 下载 2 安装 texstudio的安装及简单设置 1 设置中文界面 2 添加行号 3 设置编译器与编码 4 第一个简单程序 小白人生第一次认识 Latex 一晚上加一上午安装配置成功 参考
  • 【Java设计模式】这么详细,你还不懂建造者模式嘛!

    我是清风 每天学习一点点 快乐成长多一点 这些都是我的日常笔记以及总结 目录 建造者 建造者模式和工厂模式区别 业务场景 UML类图 源码解析 StringBuilder 源码分析 SringBuffer 开源框架 spring中BeanD
  • ZeroTierr的moon云服务器搭建和使用

    搭建moon 本质上是在云服务器上建立一个moon服务器 也加入zerotier的Network ID 服务器记录请求路径来做类似于DNS的解析 让设备之间p2p直连 问题是ZeroTier One本身的服务器都在国外访问速度很慢 可以通过
  • 【AI实战】BERT 文本分类模型自动化部署之 dockerfile

    AI实战 BERT 文本分类模型自动化部署之 dockerfile BERT BERT 文本分类模型 基于中文预训练bert的文本分类模型 针对多分类模型的loss函数 样本不均衡时 多标签分类时 dockerfile 编写 dockerf
  • 淘宝logo设计遇到的坑

    看了抖音上一些大神设计的logo 被惊艳到了 新开了一个公众号 所以也想设计一个有创意的logo 想到就去做 开始吧 我就忘记了 付款前 应该先搜一下TB logo设计的坑 先说我的教训吧 教训 终于明白 这些店是怎么赚钱的了 只要你付款了
  • 切换摄像头操作(前置、后置)

    一 默认进入页面后直接加载并调用摄像头 调用摄像头的方法 function takePhoto if navigator mediaDevices getUserMedia navigator getUserMedia navigator
  • [转]unity作品打包

    unity作品打包 每当项目完成后最重要的就是项目打包 首先打包之前要看项目内部是否有错误 以保证项目的正确 1 在unity上部找到File 文件 选项卡 并点击进入 2 点击Flie选项卡中的Build Settings选项 3 完成上
  • 为什么文学也可以解决许多问题

    文学是一种艺术形式 通过语言和叙事手法创造出各种文学作品 如小说 诗歌 戏剧等 它具有独特的力量和功能 能够解决许多问题的原因如下 情感共鸣与同理心 文学作品可以引起人们的情感共鸣和同理心 通过创造生动的角色 复杂的情节和丰富的描绘 文学作
  • 浅谈VVC(H.266)的变换模块

    转自 https zhuanlan zhihu com p 108792210 本文将分为四个部分对下一代视频编码标准Versatile Video Coding VVC 的变化模块进行介绍 第一部分简单介绍一下视频编码的发展历程以及VVC
  • surface pro 4专业版没有64位虚拟机选项的解决办法

    前言 因为surface没办法开bios的虚拟化支持 所以博主也是打电话亲自询问了微软的客服然后得出的结论 这个因为可能微软对自己产品的封锁吧 你装vmware也好 Virualbox也好 都是只有32位系统的 然后呢 也是一样的 选择代数
  • 【QT】——信号和槽

    1 信号和槽的概念 信号和槽是 Qt 特有的信息传输机制 是 Qt 设计程序的重要基础 它可以让互不干扰的 对象建立一种联系 当信号发出时 被连接的槽函数会自动被回调 这就类似观察者模式 当发生了感兴趣的事件 某一个操作就会被自动触发 1
  • 《C++ Primer》学习笔记(十四):重载运算与类型转换

    C Primer 学习笔记 十四 重载运算与类型转换 输入和输出运算符 算术和关系运算符 赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 标准库定义的函数对象 可调用对象与function 当一个重载的运算是成员函
  • 做视频剪辑必须学会的几个剪辑软件,你知道哪些?

    现在短视频非常火热 身边70 以上的人或多或少都会使用手机APP快速剪辑视频 但是如果大家想要通过视频剪辑变现 或者想要自己的视频出彩 那么掌握系统的剪辑方法 剪辑软件的使用是必不可少的 今天小编就给大家分享几款我在剪辑视频中会常常用到的软
  • android 验证码短信验证码,Android​短信验证码倒计时验证的2种常用方式

    前言 本文主要介绍的是短信验证码功能 这里总结了两种常用的方式 可以直接拿来使用 看图 计时器 说明 这里的及时从10开始 是为了演示的时间不要等太长而修改的 方法如下 1 第一种方式 Timer Description 自定义Timer
  • thinkcmf5 pc切换手机

    1 在simplewind cmf common php 里找到 获取当前主题名 添加 if cmf is mobile theme config cmf mobile default theme else theme config cmf
  • java 返回function_Java8通过Function获取字段名

    摘要 Java8通过Function获取字段名 不用再硬编码 效果类似于mybatis plus的LambdaQueryWrapper 本文总共三个步骤 1 使Function获取序列化能力 2 通过SFunction获取字段名 3 建一些