javac -help
-parameters 生成元数据以用于方法参数的反射
意思就是我们想获取方法中的参数名的话就要加这个参数
我们先看普通编译javac App.java
public class App {
public void test(String str, Integer integer) {
System.out.println(str);
System.out.println(integer);
}
public static void main(String[] args) throws ParseException, NoSuchMethodException {
Method[] methods = App.class.getMethods();
Method testMethod = App.class.getMethod("test", String.class, Integer.class);
Class<?>[] parameterTypes = testMethod.getParameterTypes();
Parameter[] parameters = testMethod.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter.getName());
}
}
}
//结果:arg0 arg1
public void test(java.lang.String, java.lang.Integer);
descriptor: (Ljava/lang/String;Ljava/lang/Integer;)V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_1
4: invokevirtual #3 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: aload_2
11: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
14: return
LineNumberTable:
line 9: 0
line 10: 7
line 11: 14
我们可以看到,并没有拿到方法参数的名字
换成javac -parameters
运行结果str integer
拿到了方法参数名
public void test(java.lang.String, java.lang.Integer);
descriptor: (Ljava/lang/String;Ljava/lang/Integer;)V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_1
4: invokevirtual #3 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: aload_2
11: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
14: return
LineNumberTable:
line 9: 0
line 10: 7
line 11: 14
MethodParameters:
Name Flags
str
integer
我们可以看到编译信息中多了MethodParameters
不过这个 -parameters好像是java8才有的,基于java8以前版本的spring中比如controller中接收参数需要获取参数名这种,spring是自己封装了方法来实现。