动态类型语言、静态类型语言
动态类型语言:在运行期才会进行数据类型检查的语言。展开来说,对于动态语言,定义的变量是没有类型的,只要到了运行期,根据实际赋值的对象才确定类型,也就是说“变量无类型变量值才有类型”;在编译期给变量赋什么类型的值都可以,变量调用什么方法都可以,这样的话,在运行期进行类型检查时就增加了出错的风险,比如,在运行期,变量根据赋给它的值确定了类型,在调用方法的时候,发现调用的方法在此类型中没有,就会报错崩溃。
静态类型语言:在编译期就进行数据类型检查的语言。在编译期变量的类型就已经确定,所以在编译期类型检查的时候就能知道赋值的变量值类型对不对,变量调用的方法对不对,这也就是编译期类型检查的工作。
动态类型语言的核心概念是到了运行期才知道调用的方法是属于哪个类(类型)的,也就是说类型的确定是在运行期,是动态的,一般说动态就是指在运行期。
java语言本身是静态类型的语言,从java 1.7开始有了对动态类型的支持,注意这里说的是对动态类型的支持而不是说java变成了动态类型语言;其实就是在java语言层面上实现了在运行期确定方法是属于哪个类的,为了实现对动态类型的支持,java抽象出了一个函数类型的概念,用MethodHandle类来表示,也叫函数句柄,在运行期根据逻辑来决定函数句柄绑定到哪个类型上;我们想想,在java中,也只有抽象出一个函数类型(句柄)的概念,才能实现动态类型的支持。
对于一个概念在不同语言上的实现,我们要注意抽象理解,虽然都是实现了某种概念,但是实现方案是不一样的。
java对动态类型的支持不要和动态绑定混淆了,它们虽然名字都有动态,是属于不同的范畴,动态绑定是在jvm对多态的支持,也就是说,jvm能找到引用真正指向的对象,进而定位到真正调用的方法。需要强调的是RTTI针对的继承关系中向下转型的类型识别,这点要理解清楚。
jvm对动态类型语言的支持
首先明确一个概念,jvm和java是对立发展的,jvm是可以支持各种语言的,只要满足字节码规范就行,比如kotlin、Groovy。
jvm对动态类型语言的支持,增加了invokedynamic指令,不过java在语言层面是无论如何都不会编译出这个指令,这是为其它动态语言而准备的。
java获取运行期类型信息的方式
类型信息在运行期是通过Class类的对象来表示的。