【问题标题】:Where's the code for a lambda located in a java class file?位于 java 类文件中的 lambda 代码在哪里?
【发布时间】:2018-10-26 12:10:14
【问题描述】:

我有这个 java 源文件:

import java.util.function.*;
public class t {
   public static void main(String[] args) {
      Function<Integer,Integer> r = (a) -> a*a+2*a+1;
      System.out.println(r.apply(2));
   }
}

我编译它,它按预期工作。 Herejavap -c -v t 的输出,我在其中找不到 lambda 的位置。每当调用 lambda 时,告诉 jvm 使用输入 Integer 计算表达式的字节码在哪里?

【问题讨论】:

  • (Ljava/lang/Integer;)Ljava/lang/Integer; 来自 javap 输出,接受 Integer 参数并返回 Integer
  • @HemantPatel 告诉 jvm 计算表达式 a*a+2*a+1 的代码在哪里

标签: java lambda functional-programming jvm bytecode


【解决方案1】:

如果你想查看你的 lambda body a*a+2*a+1 的代码,你应该调用 javap -c -v -p t 来查看 private 方法:

private static java.lang.Integer lambda$main$0(java.lang.Integer);
descriptor: (Ljava/lang/Integer;)Ljava/lang/Integer;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
  stack=3, locals=1, args_size=1
     0: aload_0
     1: invokevirtual #7                  // Method java/lang/Integer.intValue:()I
     4: aload_0
     5: invokevirtual #7                  // Method java/lang/Integer.intValue:()I
     8: imul
     9: iconst_2
    10: aload_0
    11: invokevirtual #7                  // Method java/lang/Integer.intValue:()I
    14: imul
    15: iadd
    16: iconst_1
    17: iadd
    18: invokestatic  #4                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    21: areturn
  LineNumberTable:
    line 4: 0

关于 lambda 内部实现的更详细答案在这里:How will Java lambda functions be compiled?

【讨论】:

  • 您将在堆栈跟踪中看到这些方法。它们是以名称“lambda$”开头的私有静态方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2013-02-09
  • 2016-06-18
  • 2010-09-19
相关资源
最近更新 更多