当前位置: 首页 > 面试题库 >

为什么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()));
    }
}

[ private static void Main.lambda $ main $ 0() ,public static void
Main.main(java.lang.String [])]

:生成实现功能接口的类。

System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));

已生成一个类:类Main $$ Lambda $ 1/149928006

实现一个功能接口:[interface java.lang.Runnable]

问题此静态方法需要什么? 为什么不能将lambda主体直接放入接口方法中?就像是:

class Main$$Lambda$1 {
    public void run() {
        /* Lambda body here */
    }
}

问题答案:

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

  • 字节码首先从哪里来?lambda代理类是在运行时生成的,而不是在编译时生成的。如果我们将字节码填充到代理类中,则它必须来自某个地方。这意味着我们必须将其放入捕获类文件中 ,然后将复制 到代理类中。在这里,它只存在于捕获类中,我们就完成了。
  • 访问控制。如果lambda主体调用私有方法怎么办?通过将其分解为捕获类,它会自动获取捕获类的访问控制上下文(从逻辑上讲,它是其中的一部分。)如果将字节码放入代理类中,则必须做一些额外的魔术才能赋予它正确的访问控制上下文。


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

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

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

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

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

  • 默认添加的栏目为静态浏览,是不生成静态的需要在栏目中配置是否生成静态