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

javassist

使用javassist获取参数名

1,添加依赖

需要在pom.xml文件中添加下面的依赖:

<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version>
</dependency>

2,示例代码及详解

// UserController.java
package com.example;public class UserController {public void saveUser(String username, int age) {// 方法实现}
}

下面是使用 javassist 获取 saveUser 方法参数名的代码:

import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class ParameterNameExtractor {public static void main(String[] args) throws Exception {// 反射获取目标类的方法Class<?> targetClass = Class.forName("com.example.UserController");Method method = targetClass.getMethod("saveUser", String.class, int.class);// 获取 ClassPool 实例,它是 javassist 的类池,用于管理类的字节码ClassPool pool = ClassPool.getDefault();// 获取目标类的 CtClass 对象,CtClass 表示类的字节码表示CtClass ctClass = pool.get(targetClass.getName());// 获取方法的参数类型数组Class<?>[] parameterTypes = method.getParameterTypes();//参数类型数组CtClass[] ctParams = new CtClass[parameterTypes.length];for (int i = 0; i < parameterTypes.length; i++) {ctParams[i] = pool.getCtClass(parameterTypes[i].getName());}// 获取目标方法的 CtMethod 对象CtMethod ctMethod = ctClass.getDeclaredMethod(method.getName(), ctParams);// 获取方法的字节码信息MethodInfo methodInfo = ctMethod.getMethodInfo();// 获取方法的代码属性CodeAttribute codeAttribute = methodInfo.getCodeAttribute();// 获取方法的局部变量属性,其中包含参数名信息LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);if (attr == null) {System.out.println("未找到局部变量属性,可能编译时未保留参数名信息。");return;}// 确定参数名的起始`在这里插入代码片`位置int pos = java.lang.reflect.Modifier.isStatic(method.getModifiers()) ? 0 : 1;List<String> parameterNames = new ArrayList<>();int parameterCount = method.getParameterCount();for (int i = 0; i < parameterCount; i++) {// 获取参数名String parameterName = attr.variableName(i + pos);parameterNames.add(parameterName);}// 输出参数名System.out.println("方法 " + method.getName() + " 的参数名:");for (String name : parameterNames) {System.out.println(name);}}
}

相关文章:

  • windows下用xmake交叉编译鸿蒙.so库
  • 【Easylive】Interact与Web服务调用实例及网关安全拦截机制解析
  • 新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码
  • eSTK.me
  • 【ELF2学习板】利用OpenMP采用多核并行技术提升FFTW的性能
  • 图像预处理-图像边缘检测(流程)
  • 力扣算法ing(60 / 100)
  • 代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南
  • 精益数据分析(5/126):解锁创业成功的关键密码
  • 运算符重载
  • LeetCode(Hot.2)—— 49.字符异位词分组题解
  • 【win 1】win 右键菜单添加 idea pycharm vscode trae 打开文件夹
  • 笔试专题(十一)
  • 什么编程语言市场竞争小,但还易学?
  • Docker应用端口查看器docker-port-viewer
  • 基于springboot的老年医疗保健系统
  • HTML5 应用程序缓存:原理、实践与演进
  • 【Vue】模板语法与指令
  • 图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化
  • 【Linux】线程ID、线程管理、与线程互斥
  • 一季度全社会用电量同比增长2.5%,3月增速显著回升
  • 两部门通报18个破坏耕地、毁林毁草典型问题
  • 特朗普叫停已许可的海上风电,机构将美国风电前景下调40%
  • 武汉一超高层住宅顶楼违建成“不死小强”,相关部门回应
  • 汪文斌人民日报撰文:让中柬友好合作结出更加丰硕的成果
  • 海外需求增长推动价格飙升,正丹股份去年净利润暴增119倍