当前位置: 首页 > 知识库问答 >
问题:

为什么lambda翻译需要生成静态方法?

卫嘉佑
2023-03-14

Lambda转换是一个两步的过程,第一步:将Lambda解聚为同一个类中的静态方法。

public class Main {
    public static void main(String[] args) {
        Runnable r = () -> System.out.println("Hello");
        System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));
    }
}
System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));
class Main$$Lambda$1 {
    public void run() {
        /* Lambda body here */
    }
}

共有1个答案

夏侯自珍
2023-03-14

除了这里给出的正确答案(因为当前的方案更高效,减少了lambda的捕获/链接成本,并减少了代码重复)之外,还有一些其他原因说明您的想法根本没有意义。

  • 字节码首先来自哪里?lambda代理类是在运行时生成的,而不是在编译时生成的。如果我们要将字节码填充到代理类中,它必须来自某个地方。这意味着我们必须将其放入捕获类文件中,然后将其复制到代理类中。在这里,它只存在于捕获类中,我们就完成了。
  • 访问控制。如果lambda体调用私有方法怎么办?通过将其解聚到捕获类中,它自动获取捕获类的访问控制上下文(它在逻辑上是捕获类的一部分)如果我们将字节码放在代理类中,我们就必须执行额外的魔法来为它提供正确的访问控制上下文。
 类似资料:
  • 问题内容: Lambda转换是一个两步过程, 一个是 :将lambda分解为同一类中的静态方法。 [ private static void Main.lambda $ main $ 0() ,public static void Main.main(java.lang.String [])] 二 :生成实现功能接口的类。 已生成一个类:类Main $$ Lambda $ 1/149928006

  • 问题内容: 这是指帖子 ..无法回复或评论任何这样创建的新帖子。为什么是我的 发出警告-应该以静态方式访问静态字段MyUnits.MILLSECONDS吗?谢谢。 问题答案: 因为当您访问静态字段时,您应该在类(或本例中为枚举)上执行此操作。如 不在实例中 编辑 要解决 为什么这样 的问题:在Java中,当您将声明为时,就是说它是类的成员,而不是对象(因此为什么只有一个)。因此,在对象上访问它是没

  • 问题内容: Java main()方法的方法签名为: 此方法是否有理由是静态的? 问题答案: 该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?特别是如果你的班级是这样的: JVM应该调用吗?它应该做什么x? 如果不是,JVM是否应该在不运行任何构造方法的情况下实例化?我认为不应该这样,因为这将对整个类进行特殊处理-有时你有一个尚未初始化的实例,并且必须在每个可以调用的方法中进行检查。 对于

  • 我有一个控制器操作,它在Firefox本地和生产环境中都能正常工作,在IE本地工作,但在生产环境中不能正常工作。以下是我的控制器操作: 这是我在IE中得到的堆栈跟踪: 错误。处理您的请求时出错。系统。非静态方法需要一个目标。at系统。系统上的reflection . runtimemethodinfo . check consistency(对象目标)。reflection . runtimeme

  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式

  • 本文向大家介绍ASP.NET静态页生成方法,包括了ASP.NET静态页生成方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ASP.NET静态页生成方法。分享给大家供大家参考。具体实现方法如下: 一、问题: 由于业务需要,得把页面按照模板页生成静态页面,所以自己就琢磨了下,写些思路,以备日后需要的时候用。 二、解决方法: 静态页生成用到最多的就是匹配跟替换了,首先得读取模板页的html内