赞
踩
目录
1.2 MethodHandle和Reflection的区别
动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期,满足这个特征的语言有很多,比如JavaScript、Python等,相对的,在编译期就进行类型检查的语言(如C++/Java等)就是最常用的静态类型语言。
例如以下代码:
obj.println("hello world");
假设这行代码在Java语言中,并且变量obj的静态类型为java.io.PrintStream,那么变量obj的实际类型就必须是PrintStream的子类(实现了PrintStream接口)才是合法的,否则哪怕obj确实有一个合法的println(String)方法,但与PrintStream接口没有继承关系,代码也不能运行,因为类型检查不合法。
而同样的代码在JavaScript中的情况则不一样,无论obj具体是何种类型,只要这种类型的定义中确实包含有println(String)方法,那么方法调用就可以成功。
这种差别产生的原因是,Java语言在编译期就将println(String)方法完整的符号引用就生成出来,作为方法调用指令的参数存储到class文件中,例如如下代码:
invokevirtual #4//Method java/io/printStream.println:(Ljava/lang/String;)V
这个符号引用包含了此方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。