invokedynamic 指令是干什么的?
编程吧
全部回复
仅看楼主
level 12
Java 7 开始,新引入的字节码指令,可以实现一些动态类型语言的功能。Java 8 的 Lambda 表达式就是通过 invokedynamic 指令实现,使用方法句柄实现。
2023年02月15日 02点02分 1
level 11
在LambdaForm中会调用Invokers.checkExactType去检查参数类型,然后调用Invokes.CheckCustomized方法。最后,调用方法句柄的invokeBasic方法。invokeBasic同样会被jvm特殊对待,执行时,会调用到方法句柄本身所持有的适配器里,也是一个LambdaForm。这个LambdaForm会获取方法句柄里的MemberName字段,作为参数调用linkToStatic方法。当然,linkToStatic也会做特殊处理,会根据传入的参数 储存的索引 直接跳转到目标方法。 在这些方法里 Invokes.CheckCustomized在超过 一个阈值时就会进行优化 阈值可用参数 -Djava.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD进行设置,默认是127.当调用次数大于这个阈值的时候,Invokes.CheckCustomized会为该方法句柄生成一个特有的适配器,这个适配器就会将方法句柄作为常量 直接获取MemberName类型的字段 供linkToStatic调用。
2023年02月15日 05点02分 2
感谢分享[哈哈]
2023年02月15日 09点02分
1