【发布时间】:2016-01-07 08:59:58
【问题描述】:
来自How to get Method Parameter names in Java 8 using reflection?
我知道使用 javac -parameters 参数可以将参数名称保留在 *.class 文件中。
但在 lambda 表达式中无效?
示例:
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class MyTest {
public static void main(String[] args) {
for(Method m : Test.class.getDeclaredMethods()) {
System.out.println(m.getName());
for(Parameter p : m.getParameters()) {
System.out.println(" => " + p.getName());
}
}
}
}
interface MyInterface {
Object doSomething(int a, int b);
}
class Test {
private void bar(MyInterface iface) {
}
public void foo() {
bar((x, y) -> null);
}
}
当我这样做时
javac -parameters MyTest.java
java MyTest
打印出来
bar
=> iface
foo
lambda$foo$0
=> arg0
=> arg1
我尝试做javap -c -p -verbose Test:
{
Test();
descriptor: ()V
flags:
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 21: 0
private void bar(MyInterface);
descriptor: (LMyInterface;)V
flags: ACC_PRIVATE
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 24: 0
MethodParameters:
Name Flags
iface
public void foo();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokedynamic #2, 0 // InvokeDynamic #0:doSomething:()LMyInterface;
6: invokespecial #3 // Method bar:(LMyInterface;)V
9: return
LineNumberTable:
line 27: 0
line 28: 9
private static java.lang.Object lambda$foo$0(int, int);
descriptor: (II)Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=1, locals=2, args_size=2
0: aconst_null
1: areturn
LineNumberTable:
line 27: 0
}
我可以找到参数名称iface,但找不到x或y
【问题讨论】:
-
您应该详细说明“当我得到他们的名字时”,即告诉我们您如何获得
parameters数组,而不是如何打印其元素。 -
您使用哪个 JDK 版本?此示例正确显示了我使用 1.8.0_60 的机器上的参数名称。