解析JDK 7的动态类型语言支持 (解析jdbc原生sql)

解析JDK 7的动态类型语言支持 (解析jdbc原生sql)

但遗憾的是 Java 虚拟机层面对动态类型语言的支持一直都有所欠缺,主要表现在方法调用方面:JDK 7 以前字节码指令集中,四条方法调用指令(invokevirtual、invokespecial、invokestatic、invokeinterface)的第一个参数都是被调用的方法的符号引用(CONSTANT_Methodref_info 或者 CONSTANT_InterfaceMethodref_info 常量),前面已经提到过,方法的符号引用在编译时产生,而动态类型语言只有在运行期才能确定接收者类型。这样,在 Java 虚拟机上实现的动态类型语言就不得不使用“曲线救国”的方式(如编译时留个占位符类型,运行时动态生成字节码实现具体类型到占位符类型的适配)来实现,这样势必让动态类型语言实现的复杂度增加,也可能带来额外的性能或者内存开销。尽管可以想一些办法(如 Call Site Caching)让这些开销尽量变小,但这种底层问题终归是应当在虚拟机层次上去解决才最合适,因此在 Java 虚拟机层面上提供动态类型的直接支持就成为了 Java 平台的发展趋势之一,这就是 JDK 7(JSR-292)中 invokedynamic 指令以及 java.lang.invoke 包出现的技术背景。

声明:本文来自用户分享和网络收集,仅供学习与参考,测试请备份。