gpt4 book ai didi

lambda - 如何获取由 lambda 产生的方法的名称

转载 作者:行者123 更新时间:2023-12-04 14:34:35 25 4
gpt4 key购买 nike

简单来说,lambda 表达式编译成 static方法,因为它们不捕获 this (即不访问实例成员)。

public class App {
public static void foo(){
Consumer<Integer> c1 = n -> {};
Consumer<Integer> c2 = n -> {};
}

public static void main(String [] args) {
Supplier<String> sup1 = () -> "I am sup1";
Supplier<String> sup2 = () -> "I am sup2";
Supplier<String> sup3 = () -> "I am sup3";

Stream.of(App.class.getDeclaredMethods()).forEach(System.out::println);
}
}

运行前面的示例并使用 javap 检查生成的字节码工具,我们可以看到变量引用的 lambdas c1 , c2 , sup1 , sup2 , sup3被编译为具有名称的方法:
  • lambda$foo$0
  • lambda$foo$1
  • lambda$main$2
  • lambda$main$3
  • lambda$main$4

  • 但是,如果我们打印 getClass()对于这些变量( c1c2sup1sup2sup3 )引用的每个对象,我们将分别得到:
  • class App$$Lambda$5/1705736037
  • class App$$Lambda$6/455659002
  • class App$$Lambda$1/791452441
  • class App$$Lambda$2/531885035
  • class App$$Lambda$3/1418481495

  • 那么,我们如何在运行时类名和由 lambda 产生的方法名之间建立对应关系?

    更新

    以下重复问题中指出的任何解决方案都没有帮助我解决我在问题中提出的问题:
  • How to get the MethodInfo of a Java 8 method reference?
  • Printing debug info on errors with java 8 lambda expressions 1 answer
  • Get MethodHandle from lambda object

  • 我发现的唯一方法是将@Holger 的解决方案从其答案(不是已接受的答案)调整为问题 Java 8: convert lambda to a Method instance with clousure included .但是,就我而言,不是 Method object 我只是在寻找方法的名称。所以,适应 lambdaToMethod() 到以下 methodNameFromLambda()我得到了一个解决方案:
    static String methodNameFromLambda(Serializable lambda) {
    try {
    Method m = lambda.getClass().getDeclaredMethod("writeReplace");
    m.setAccessible(true);
    SerializedLambda sl=(SerializedLambda)m.invoke(lambda);
    return sl.getImplMethodName();
    } catch(ReflectiveOperationException ex) {
    throw new RuntimeException(ex);
    }
    }

    现在,示例的 lambdas 必须转换为 Consumer<Integer>&SerializableSupplier<String>&Serializable如@Holger answer 中所述.

    我不知道这个解决方案是否正确,但它适用于我的示例和我正在处理的案例。

    最佳答案

    这可能会因版本而异 - 没有说明确切名称是什么的规范 - 并且已经完成 故意 ;很好地防止代码可能会发现与这些名称有关的巧妙之处。

    关于lambda - 如何获取由 lambda 产生的方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47313521/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com