Spring获取执行方法形参的变量名称

LocalVariableTableParameterNameDiscoverer

Spring提供的一个工具类,可以获取到执行函数的形参变量名 。 原理是通过ASM操作字节码获取方法的参数名称

import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
public class Main {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        LocalVariableTableParameterNameDiscoverer localVariableTableParameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
        //目标方法对象
        Method method = Main.class.getMethod("main", String[].class);
        String[] names = localVariableTableParameterNameDiscoverer.getParameterNames(method);
        //localVariableTableParameterNameDiscoverer.getParameterNames(Constructor<?> constructor);        还可以获取构造器的参数名称
        System.out.println(Arrays.asList(names));        //[args]
    }
}

Java8之后,提供了保留方法参数名的机制,以及新的反射API Parameter

注意,必须添加编译参数 -parameters 告诉编译器保留参数名称信息

javac -parameters Main.java
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Main {
    public static void main(String[] args) throws Exception {
        Method method = Main.class.getMethod("foo", String.class);
        Parameter[] parameters = method.getParameters();
        //参数的描述对象
        Parameter parameter = parameters[0];
        String name = parameter.getName();
        System.out.println(name);        //filePath
    }
    public static void foo(String filePath) throws IOException {}
}