Где код лямбды, расположенный в файле класса Java? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот исходный файл 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));
   }
}

Я компилирую его, и он работает как положено. Здесь вывод javap -c -v t, и я не могу найти местоположение лямбды в нем. Где байт-код, который указывает jvm вычислять выражение с помощью ввода Integer всякий раз, когда вызывается лямбда?

1 Ответ

0 голосов
/ 16 мая 2018

Если вы хотите увидеть код вашего лямбда-тела 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

Более подробный ответ овнутренняя лямбда-реализация здесь: Как будут компилироваться лямбда-функции Java?

...