1.5 KiB
1.5 KiB
动态类型语言
动态语言类型:它的类型检查的主体过程是在运行期而不是在编译期进行的 在编译期进行类型过程检查的为静态类型语言 静态类型语言能在编译器确定变量类型,编译器可以提供全面严谨的类型检查,与数据类型相关的潜在问题能在编译时及时发现,利于稳定性及让项目达到更大的规模,动态类型语言在运行时确定类型,可以为开发人员提供极大灵活性,清晰简洁的实现某些功能,提高开发效率
Java与动态类型
动态类型方法调用时,由于无法确定调用对象的静态类型,导致方法内联无法有效进行
java.lang.invoke包
在之前单纯依靠符号引用来确定调用的目标方法之外,通过方法句柄动态确定目标方法 MethodHandle与Reflection的区别
- 都是在模拟方法调用,Reflection时在模拟Java代码层次调用,MethodHandle时在模拟字节码层面调用。
- Reflection中的Method对象比MethodHandle对象包含的信息来得多
- MethodHandle是对字节码的方法指令调用的模拟,虚拟机在这方法做的各种优化,在MethodHandle上也可以采用类似的思路去支持。
- MethodHandle可以服务于Java虚拟机上的所有语言
invokedynamic指令
解决原有的4条invoke*指令方法分派规则完全固化在虚拟机中的问题,把如何查找目标方法的决定权从虚拟机转嫁到具体用户代码中,让用户有更高的自由度