学习过jdk1.8新特性后,知道了Lambda可以简化匿名内部类的写法
下面一下实现原理
1.首先看一下匿名内部类的写法,编译成class后是生成了xxx$1.class的匿名内部类
2.我们反编译Test01$1.class
惊不惊喜....匿名内部类底层是创建了一个clsss去实现接口
和我们自己创建一个class去实现接口差不多,匿名内部类只是编译时自动创建了而已
3.使用Lambda写法我们看下编译后的class
发现虽然lambda可以简化匿名内部类的写法,但是实现原理不一样,根本没额外创建一个calss去实现接口
4.尝试用jd-gui.反编译工具发现无法反编译
应该是jd-gui不支持jdk1.8新特性的语法反编译.....
5.使用jdk自带的javap查看字节码的工具查看lambda语法编译后的字节码
javap -c -p Test02.class
-c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
-private 显示所有类和成员。
发现字节码中生成了一个
private static java.lang.String lambda$test$0();
的静态方法,里面执行是是我们在lambda {}语句块中的语句,
也就是说底层原理是lambda生成了一个静态代理方法,来执行代码块的语句。