使用JavaAssist获取方法参数名

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]
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,方法可以作为参数传递给其他方法。这种方法称为高阶函数或者函数式接口。为了实现这种功能,Java 8 引入了 Lambda 表达式和函数式接口。以下是一个简单的例子: ```java public class MethodAsParamExample { public static void main(String[] args) { // 定义一个方法,该方法接受一个整数和一个函数式接口作为参数 // 函数式接口的类型是 IntUnaryOperator,它接受一个整数并返回一个整数 int result = operate(5, x -> x * x); System.out.println(result); // 输出 25 } // 接受一个整数和一个函数式接口作为参数,并使用该函数式接口对整数进行操作 public static int operate(int num, IntUnaryOperator operator) { return operator.applyAsInt(num); } } ``` 在上面的例子中,我们定义了一个 `operate` 方法,该方法接受一个整数和一个函数式接口 `IntUnaryOperator` 作为参数。函数式接口 `IntUnaryOperator` 是一个只有一个抽象方法 `applyAsInt(int operand)` 的接口,它接受一个整数并返回一个整数。 我们在 `main` 方法中调用了 `operate` 方法,并将整数 5 和一个 Lambda 表达式 `(x -> x * x)` 作为参数传递给它。Lambda 表达式 `(x -> x * x)` 表示一个函数,它接受一个整数并返回这个整数的平方。在 `operate` 方法中,我们调用了 Lambda 表达式所表示的函数式接口的 `applyAsInt` 方法,将整数 5 作为参数传递给它,得到了整数 25。 这就是 Java方法作为参数的一个简单例子。通过使用 Lambda 表达式和函数式接口,我们可以实现更加灵活的方法调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值