java 取值 表达式_如何在java 8 lambda表达式中获取方法参数名称?

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();

descriptor: ()V

flags:

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值