-Djdk.internal.lambda.dumpProxyClasses
1、剖析lambda表达式的底层实现原理
@FunctionalInterface
编译系统编译lambda表达式的时候,会有哪些变化
常量池多出
Dynamic_info
两个MethodHandle
一个MethodType
方法
invokedynamic
将lambda表达式代码块生成一个方法
类属性
BootstrapMethods
编译系统 javac
运行系统 java
JVM是如何执行lambda表达式的
0 invokedynamic #2
1、会生成一个对象:CustomLambda的实现类对象
2、将对象入栈
5 astore_1
1、拿到栈顶元素
2、给局部变量表index=1的位置赋值
6 aload_1
7 invokeinterface #3
12 return
()V
()Lcom/ziya/jvm/example/java/lang/lambda/CustomLambda;
dynamic_info
1、描述信息
run run方法与lambda$main$0进行关联
返回值 玩字节码,需要知道返回的对象结构
2、bootstrapMethod
1、invokedynamic 支持动态调用
2、BootstrapMethod
Bootstrap方法
java/lang/invoke/LambdaMetafactory.metafactory
最核心的部分 自实现也是基于这个方法
CallSite 动态调用点
参数
metafactory方法的参数
MethodHandle
TestLamda->Lambda表达式
MethodHandles.Lookup lookup = MethodHandles.lookup(); TestLamda对应的lookup
自实现的JVM->TestLamda->Lambda表达式 如何生成lookup
TestLamda对应的lookup
MethodHandles.lookup(TestLamda.class);
MethodHandles
MethodType
MethodHandle+反射来实现
2、如何手写实现
无参
有参
3、两种实现方式
MethodHandle
javaassist
4、代码讲解