java8如何根据属性名这个字符串创建SFunction

java如何根据属性名这个字符串创建SFunction?(mybatis plus 中的LambdaQueryWrapper使用到的SFunction)

问题描述

比如我有一个Person类 里面有name属性 我怎么根据name这个字符串和Person这个class 获取SFunction

解决方案:

我搜了好久才搜到一个与我这个问题相关的,链接如下:
可以根据fieldname生成SFunction吗
这篇文章只给出了部分代码,让我参考着改,然后我就看了他给出的代码,自己写了一份完整的
以下是完整的代码:

/*** 获取与实体类字段对应的 SFunction 对象。* @param entityClass 实体类的 Class 对象。* @param fieldName 实体类中的字段名。* @return 返回找到的 SFunction 对象。*/public static SFunction getSFunction(Class<?> entityClass, String fieldName) {// 检查缓存中是否已经有了对应的 SFunction 对象。if (functionMap.containsKey(entityClass.getName() + fieldName)) {return functionMap.get(entityClass.getName() + fieldName);}// 获取实体类中名为 fieldName 的字段。Field field = getDeclaredField(entityClass, fieldName);if (field == null) {//如果字段不存在,使用 ExceptionUtils 抛出一个异常,指出实体类中没有找到该字段。throw ExceptionUtils.mpe("This class %s is not have field %s ", entityClass.getName(), fieldName);}SFunction func = null;// 获取 MethodHandles.Lookup 实例,用于反射操作。final MethodHandles.Lookup lookup = MethodHandles.lookup();// 定义方法类型,表示实体类的实例方法,该方法返回字段的类型。MethodType methodType = MethodType.methodType(field.getType(), entityClass);// 用于存储 LambdaMetafactory 创建的 CallSite 对象。final CallSite site;// 构造标准的 Java getter 方法名。String getFunName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {// 使用 LambdaMetafactory 创建一个动态的 SFunction 实例。site = LambdaMetafactory.altMetafactory(lookup,"invoke",MethodType.methodType(SFunction.class),methodType,lookup.findVirtual(entityClass, getFunName, MethodType.methodType(field.getType())),methodType,FLAG_SERIALIZABLE);// 使用 CallSite 来获取 SFunction 实例。func = (SFunction) site.getTarget().invokeExact();// 将生成的 SFunction 实例存储到缓存中。functionMap.put(entityClass.getName() + field.getName(), func);return func;} catch (Throwable e) {// 如果在创建 SFunction 过程中发生异常,抛出异常,指出实体类中没有找到对应的 getter 方法。throw ExceptionUtils.mpe("This class %s is not have method %s ", entityClass.getName(), getFunName);}}/*** 递归获取类中声明的字段,包括私有字段。* @param clazz 要检查的类。* @param fieldName 要查找的字段名。* @return 返回找到的 Field 对象,如果没有找到则返回 null。*/public static Field getDeclaredField(Class<?> clazz, String fieldName) {Field field = null;// 遍历类及其父类,直到到达 Object 类。for (; clazz != Object.class; clazz = clazz.getSuperclass()) {try {// 尝试获取声明的字段。field = clazz.getDeclaredField(fieldName);// 如果找到字段,返回该字段。return field;} catch (NoSuchFieldException e) {// 如果没有找到字段,继续查找父类。// 这里不处理异常,让其继续执行循环。}}// 如果没有找到字段,返回 null。return null;}

使用:

//Person类中必须包含"name"字段.
SFunction sFunction = getSFunction(Person.class, "name");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端如何设置div视图可滚动

前端如何设置div视图可滚动&#xff1f; 要使一个 div 元素可滚动&#xff0c;你可以通过设置其 overflow CSS 属性来实现。以下是如何设置的简单步骤&#xff1a; HTML 结构&#xff1a; html复制代码 <div class"scrollable-div"> <!-- 这里放入大量的…

window11事件查看器中“在事件中只要触发此事件,就会执行相关非XX.xml脚本”

在事件中只要触发此事件&#xff0c;就会执行相关非XX.xml脚本 一、操作过程 1、在时间查看器中&#xff0c;将任务附加到此事件上 2、按照提示逐步下一步添加完成 3、只要触发1中的事件&#xff0c;那么就会执行对应的关联脚本xx.xml。 二、解决办法 1、通过开始菜单搜索打…

已解决java.util.MissingFormatArgumentException异常的正确解决方法,亲测有效!!!

已解决java.util.MissingFormatArgumentException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 示例报错代码&#xff1a; 解决思路 解决方法 检查并修正格式化字符串与参数 示例修正代码&#xff1a; 错误示…

PostgreSQL自带的命令行工具13- pg_waldump

PostgreSQL自带的命令行工具13- pg_waldump 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_waldump 是 Po…

企业信息泄密的手段有哪些?如何预防数据泄露?

企业信息防泄密是当今企业安全领域的重要议题。随着信息技术的快速发展&#xff0c;企业的信息安全面临着前所未有的挑战。企业信息防泄密不仅关乎企业的商业机密和核心竞争力&#xff0c;更直接关系到企业的声誉、财务安全以及法律合规。因此&#xff0c;建立一套完善的企业信…

第十五届蓝桥杯省赛大学B组(c++)

很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦... 这篇文章主要对第十五届省赛大学B组(C)进行一次完整的复盘,这次省赛2道填空题6道编程题: A.握手问题 把握手情景看成矩阵: 粉色部分是7个不能互相捂手的情况 由于每个人只能和其他人捂手, 所以黑色情况是不算的 1和2握手2和…

言出身随!人情世故:利益交换与人脉的重要性——早读(逆天打工人爬取热门微信文章解读)

巴黎输了&#xff0c;看了比赛还得加班 引言Python 代码第一篇 洞见 认知越高的人&#xff0c;越懂得感恩第二篇 冯站长之家 2024年5月8日&#xff08;周三&#xff09;三分钟新闻早餐结尾 智慧赋予我决策的明灯 勇气则是我行动的盾牌 在细雨中骑行 是我以智慧选择的道路 用勇气…

Qt跨平台开发demo(适用萌新)

最近需要参与一款Qt跨平台的软件开发&#xff0c;在此之前&#xff0c;特把基础信息做学习和梳理&#xff0c;仅供参考。 所使用的技术和版本情况如下&#xff1a; 虚拟机&#xff1a;VMware 16.2.5操作系统&#xff1a;ubuntu-20.04.6-desktop-amd64&#xff1a;Mysql数据库…

Java list中实体类的按照某个字段大小排序

Java list中实体类的按照某个字段大小排序 在Java中&#xff0c;可以使用Collections.sort()方法结合自定义的比较器来对List中的实体类按照某个字段进行排序。以下是一个示例代码&#xff0c;演示了如何根据实体类中的age字段对List进行排序&#xff1a; import java.util.A…

YOLOv8原理解析[目标检测理论篇]

接下来是我最想要分享的内容&#xff0c;梳理了YOLOv8预测的整个流程&#xff0c;以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地介绍本章内容&#xff0c;还是把YOLOv8网络结构图放在这里&#xff0c;方便查看。 1.YOL…

面试 Java 并发编程八股文十问十答第十二期

面试 Java 并发编程八股文十问十答第十二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;线程安全&#x…

鸿蒙L0软总线demo程序

软总线是鸿蒙特有的功能之一&#xff0c;本篇提供了一个运行于L0的软总线demo程序。 demo的流程&#xff1a; 1.dsoftbus_start() 入口启动函数&#xff0c;启动后循环发布、发现、发现节点后连接节点。 int dsoftbus_start() {if (init() < 0) {return -1;}if (!dsoftbu…

2024年成都市企业技术标准制(修)订申报条件奖励、材料流程须知

一、2022 年期间奖励项目 (一)申报条件 2022 年期间主导制(修)订并获批发布国际、国家和行业技术标准的工业和信息化企业(其中:民营企业获批发布时间在2022年1月1日至2022年12月31日期间&#xff0c;其他企业获批发布时间在2022年1月1日至2022年7月7日期间)。 (二)支持标准 …

Kubernetes安全管理概览

目录 1、认证&#xff08;Authentication&#xff09;2、授权&#xff08;Authorization&#xff09;3、网络策略&#xff08;Network Policies&#xff09;4、Pod安全策略&#xff08;Pod Security Policies, PSP&#xff09;5、机密管理&#xff08;Secrets Management&#…

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念&#xff1a; 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例&#xff1a; int a 10; int b 20; int …

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

nacos核心源码深度剖析

文章目录 一、nacos1.4.1版本&#xff1a;服务注册与发现架构原理1、基本原理2、Nacos&Ribbon&Feign核心微服务架构图3、Nacos架构图4、核心功能点5、核心功能源码分析&#xff08;1&#xff09;客户端注册逻辑&#xff08;2&#xff09;服务端注册接口&#xff08;3&a…

python:机器学习特征优选

作者&#xff1a;CSDN _养乐多_ 在Python中进行机器学习特征选择的方法有很多种。以下是一些常用的方法&#xff1a; 过滤法&#xff08;Filter Methods&#xff09;&#xff1a;通过统计方法或者相关性分析来评估每个特征的重要性&#xff0c;然后选择最相关的特征。常用的…

Linux内核--设备驱动(七)媒体驱动框架整理--HDMI框架(2)

目录 一、引言 二、drm框架 ------>2.1、画布( FrameBuffer ) ------>2.2、绘图现场(CRTC) ------>2.3、输出转换器(Encoder ) ------>2.4、连接器 (Connector ) ------>2.5、显示面(Planner) 三、VOP部分详解 ------>3.1、dts ------>3.2、v…

【0DAY】瑞友天翼应用虚拟化系统index.php接口处存在SQL注入漏洞导致程RCE

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…