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