当前位置: 首页 > ai >正文

使用SFunction获取属性名,减少嵌入硬编码

目录

问题引入

一、SFunction获取属性名称

二、选用方法

 驼峰命名转换为下划线命名

 下划线命名转换为驼峰命名

三、使用


问题引入

在编写代码时,有一些变量值需要实体类属性或对应数据库字段的硬编码

例如,SysUser类中有属性 realName

常常在map中调用,

map.put("realName","真实名称") 或者 map.get("real_name")

这种属性变量名一般直接编写成字符串嵌入在代码中

如果未来我们需要修改 realName的名称,那么不仅需要修改实体类中字段名,还常常需要依次找到并修改用到的硬编码;

也可以选择全文检索替换,但是命名相同的变量也会被迫修改

 

那么如果常用SFuction,就想利用属性的get方法反射获取到属性名的替代硬编码

这样,利用idea工具直接Shift + F6修改属性名称,对应的get和set方法也会同步修改,避免了需要手动查找替换

一、SFunction获取属性名称

/*** 使用SFunction获取属性名** @param function SFunction get方法* @return 属性名*/
public static <T, R> String getFieldNameWithSFunction(SFunction<T, R> function) {try {// 获取Lambda表达式的序列化信息Method method = function.getClass().getDeclaredMethod("writeReplace");method.setAccessible(true);SerializedLambda serializedLambda = (SerializedLambda) method.invoke(function);// 获取Lambda引用的方法名String methodName = serializedLambda.getImplMethodName();// 根据方法名推断属性名(假设是getter方法)if (methodName.startsWith("get") && methodName.length() > 3) {return methodName.substring(3, 4).toLowerCase() + methodName.substring(4);} else if (methodName.startsWith("is") && methodName.length() > 2) {return methodName.substring(2, 3).toLowerCase() + methodName.substring(3);}} catch (Exception e) {throw new RuntimeException("Failed to extract property name from lambda", e);}throw new IllegalArgumentException("Invalid lambda expression for property extraction");
}

二、选用方法

 驼峰命名转换为下划线命名
/*** 将驼峰命名法转换为下划线命名法** @param camelCase 驼峰命名法* @return 下划线命名法*/
public static String getUnderLineFromCamelCase(String camelCase) {if (camelCase == null) {return null;}StringBuilder sb = new StringBuilder();for (int i = 0; i < camelCase.length(); i++) {char c = camelCase.charAt(i);if (Character.isUpperCase(c)) {sb.append("_").append(Character.toLowerCase(c));} else {sb.append(c);}}return sb.toString();
}
 下划线命名转换为驼峰命名
    /*** 下划线命名转换为驼峰命名** @param underLine 下划线命名法* @return 驼峰命名法*/public static String getCamelCaseFromUnderLine(String underLine) {if (underLine == null) {return null;}StringBuilder sb = new StringBuilder();for (int i = 0; i < underLine.length(); i++) {char c = underLine.charAt(i);if (c == '_') {i++;sb.append(Character.toUpperCase(underLine.charAt(i)));} else {sb.append(c);}}return sb.toString();}

三、使用

//map需要使用实体属性字段名称,直接通过get方法获取
LinkedHashMap<String, String> headMap = new LinkedHashMap<>();
headMap.put(ConvertUtil.getFieldNameWithSFunction(ApplicationTaskVO::getApplicationType), "申请类型");//MyBatis 的 QueryWrapper要使用数据库字段名称,先获取属性字段名再转换为下划线格式
queryWrapper.eq(ConvertUtil.getUnderLineFromCamelCase(ConvertUtil.getFieldNameWithSFunction(ApplicationRepair::getApplicant)), sysUser.getUsername());//申请人=用户名

当需要修改时,选中实体中字段,Shift + F6,输入新的属性名,全部引用位置也同步修改

http://www.xdnf.cn/news/7628.html

相关文章:

  • 初识Linux 进程:进程创建、终止与进程地址空间
  • js绑定事件
  • RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
  • 在CuPy中使用多节点多GPU环境
  • C#基础:yield return关键字的特点
  • 2025ICPC武汉邀请赛-F
  • 游戏启动DLL文件缺失怎么解决 解决dll问题的方法
  • Vue学习路线
  • leetcode hot100刷题日记——6.和为 K 的子数组
  • 【Axure视频教程】动态地图路线
  • 实现rpc通信机制(待定)
  • R语言空间分析实战:地理加权回归联合主成份与判别分析破解空间异质性难题
  • 封装POD与PinMap文件总结学习-20250516
  • Go 语言简介
  • 操作系统的基础概念
  • 初步认识HarmonyOS NEXT端云一体化开发
  • AbMole| Phorbol 12-myristate 13-acetate(CAS号16561-29-8;目录号M4647)
  • vue+threeJs 生成烟花效果
  • PEFT简介及微调大模型DeepSeek-R1-Distill-Qwen-1.5B
  • 【css知识】flex-grow: 1
  • LibreHardwareMonitor:.Net开发的开源硬件监控项目
  • 中国机加工的市场概况及冷镦技术对于机加工替代的趋势
  • 如何在 Windows 11/10 PC 上擦除外部硬盘驱动
  • 什么叫生成式人工智能?职业技能的范式转移与能力重构
  • HarmonyOS5云服务技术分享--云存储SDK文章整理
  • 2025年 全国青少年信息素养大赛 算法创意挑战赛C++ 初中组 初赛真题
  • 94.LabelGrid 的遍历与属性编辑 Maui例子 C#例子
  • BioID技术:探索蛋白质相互作用的新方法
  • Java 05正则表达式
  • Linux中FTP服务命令使用与NFS服务