当前位置:   article > 正文

《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)_reflection和methodhandle

reflection和methodhandle

目录

一、Java动态类型语言支持

1.1 MethodHandle

1.2 MethodHandle和Reflection的区别

1.3 invokedynamic指令

二、基于栈的字节码解释执行引擎

2.1 基于栈和基于寄存器

2.2 基于栈的解释器执行过程

三、总结


一、Java动态类型语言支持

动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期,满足这个特征的语言有很多,比如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

这个符号引用包含了此方法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/199124
推荐阅读
相关标签
  

闽ICP备14008679号