一、執行過程
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類實現函數式接口,調用靜態私有方法來實現抽象方法。