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