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类实现函数式接口,调用静态私有方法来实现抽象方法。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM