gpt4 book ai didi

java - 获取 lambda 类的列表

转载 作者:行者123 更新时间:2023-12-02 11:07:17 26 4
gpt4 key购买 nike

在 Java 8 中,类的 lambda 表达式似乎保存在数组中。例如,假设我们有这个类:

public class LambdaFactory {
public Supplier<Integer> getOne(){
return () -> 42;
}

public Supplier<Integer> getTwo(){
return () -> 128;
}

public Supplier<Integer> getThree(){
return () -> 3;
}
}

然后我像这样打印出来:

    System.out.println(factory.getOne());
System.out.println(factory.getOne());
System.out.println(factory.getTwo());
System.out.println(factory.getThree());

输出将类似于

examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$2@1b9e1916
examples.LambdaFactory$$Lambda$3@ba8a1dc

所以我们在这里可以看到两件事。调用两次相同的 lambda 给我们相同的 lambda 对象(这与匿名内部类不同,在匿名内部类中我们每次都可以获得一个新的)。我们还看到它们看起来像是被保存在某种“Lambda”结构中,该结构是类的一部分

我的问题是,我可以获取类中的 lambda 表达式吗?我没有任何理由这样做,我只是喜欢剖析事物

最佳答案

lambda 由 JRE 创建,其创建方式由 JRE 控制,不同 JRE 供应商之间可能会有所不同,并且在未来版本中可能会发生变化。

如果你想玩得开心,你可以在运行时创建一个 lambda,它在类文件中没有相应的信息:

import java.lang.invoke.*;

public class ManualLambda {
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup me=MethodHandles.lookup();
MethodType t=MethodType.methodType(void.class);
MethodType rt=MethodType.methodType(Runnable.class);
CallSite site = LambdaMetafactory.metafactory(
me, "run", rt, t, me.findStatic(ManualLambda.class, "sayHello", t), t);
MethodHandle factory=site.getTarget();
Runnable r=(Runnable)factory.invoke();

System.out.println("created lambda: "+r);
r.run();
}
private static void sayHello() {
System.out.println("hello world");
}
}

上面的代码回顾了创建 lambda 时发生的情况。但对于编译时(“真正的”)lambda 表达式,整个事情是由单个 invokedynamic 字节代码指令触发的。 LambdaMetafactory.metafactory(…) 方法是 bootstrap 方法,在第一次执行 invokedynamic 指令时调用。返回的 CallSite 对象与 invokedynamic 指令永久关联。如果 CallSiteConstantCallSite 并且其 MethodHandle 在每次执行时返回相同的 lambda 对象,则 invokedynamic 指令将永远“生产”相同的 lambda 实例。

关于java - 获取 lambda 类的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23595136/

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