时间的法外狂徒

导航

lambda表达式在底层的执行过程

一、执行过程

  lambda在编译时,会先将处理逻辑生成一个私有的静态方法。并且会生成一个final类,实现lambda表达式所绑定的接口,并通过调用已生成的私有静态方法,来实现抽象方法。

二、反编译查看源码

1、先创建一个用来反编译的类

public class App{
    public static void main(String[] args){
        IInterface inter = (msg) -> System.out.println(msg);
        inter.apple("hello");
    }
    
    
    interface IInterface{
        void apple(String msg);
    }
}

2、在cmd里编译它

javac App.java

生成如下文件:

 

 第一个是接口的class文件,第二个是App.java的class文件

3、反编译App.class

javap -p App.class

结果:

Compiled from "App.java"
public class App {
  public App();//空的构造方法
  public static void main(java.lang.String[]);//main方法
  private static void lambda$main$0(java.lang.String);//处理逻辑【(msg) -> System.out.println(msg)】,生成的私有静态方法) }

4、输出内部隐藏的源代码

java -Djdk.internal.lambda.dumpProxyClasses App

结果:

 

 多出一个,App$$Lambda$1.class文件。

反编译该文件:

javap -p App$$Lambda$1.class

结果:

final class App$$Lambda$1 implements App$IInterface {
  private App$$Lambda$1();
  public void apple(java.lang.String);
}

该类实现了函数式接口,并实现了它的抽象方法,该实现就是:调用,private static void lambda$main$0(java.lang.String)方法。

总结:

1、lambda表达式,将处理逻辑生成静态私有方法。

2、生成一个final类实现函数式接口,调用静态私有方法来实现抽象方法。

posted on 2020-05-18 03:00  抄手砚  阅读(1068)  评论(0编辑  收藏  举报