使用JavaAssist获取方法参数名

文章展示了如何利用JavaAssist库中的CtClass和CtMethod等类来获取Java方法的参数名。通过创建ClassPool,插入类路径,获取指定类和方法,然后解析方法信息以提取参数名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JavaAssistUtils.java

package org.example.testJavaAssist;

import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;

import java.util.ArrayList;
import java.util.List;

public class JavaAssistUtils {
	public static List<String> getParamNames(String methodName, Class<?> clazz) {
		List<String> paramNames = new ArrayList<>();
		ClassPool pool = ClassPool.getDefault();
		pool.insertClassPath(new ClassClassPath(JavaAssistUtils.class));
		try {
			CtClass ctClass = pool.getCtClass(clazz.getName());
			CtMethod ctMethod = ctClass.getDeclaredMethod(methodName);
			// 使用javassist的反射方法的参数名
			javassist.bytecode.MethodInfo methodInfo = ctMethod.getMethodInfo();
			CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
			LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
			if (attr != null) {
				int len = ctMethod.getParameterTypes().length;
				// 非静态的成员函数的第一个参数是this
				int pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1;
				for (int i = 0; i < len; i++) {
					paramNames.add(attr.variableName(i + pos));
				}

			}
			return paramNames;
		} catch (NotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}
}

2.Student.java

package org.example.testJavaAssist;

public class Student {

	public void func1(int age, String name, Info info) {

	}
}

3.Info.java

package org.example.testJavaAssist;

import lombok.Data;

@Data
public class Info {
	private int age;
	private String address;
}

4.Main.java

package org.example.testJavaAssist;

import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<String> func1 = JavaAssistUtils.getParamNames("func1", Student.class);

		System.out.println(func1);
	}
}

/*
[age, name, info]
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值