Java 8 Lambda实现原理分析(3)

在这个函数中可以发现为Lambda表达式生成了一个内部类,为了验证是否生成内部类,可以在运行时加上-Djdk.internal.lambda.dumpProxyClasses,加上这个参数后,运行时,会将生成的内部类class码输出到一个文件中

final class Lambda$$Lambda$1 implements Print {
  private Lambda$$Lambda$1();
  public void print(java.lang.Object);
}

如果运行javap -c -p 则结果如下

final class Lambda$$Lambda$1 implements Print {
  private Lambda$$Lambda$1();
    Code:
      0: aload_0
      1: invokespecial #10                // Method java/lang/Object."<init>":()V
      4: return

public void print(java.lang.Object);
    Code:
      0: aload_1
      1: checkcast    #14                // class java/lang/String
      4: invokestatic  #20                // Method Lambda.lambda$0:(Ljava/lang/String;)V
      7: return
}

通过上面的字节码指令可以发现实现上调用的是Lambda.lambda$0这个私有的静态方法

因此最终的Lambda表达式等价于以下形式

@FunctionalInterface
interface Print<T> {
    public void print(T x);
}
public class Lambda { 
    public static void PrintString(String s, Print<String> print) {
        print.print(s);
    }
    private static void lambda$0(String x) {
        System.out.println(x);
    }
    final class $Lambda$1 implements Print{
        @Override
        public void print(Object x) {
            lambda$0((String)x);
        }
    }
    public static void main(String[] args) {
        PrintString("test", new Lambda().new $Lambda$1());
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bfef808f31cb29ebbc8f1b68816c05b8.html