invokedynamic指令

在前面java动态类型语言支持(一)(二)中我们有提到invokedynamic指令和java.lang.invoke包中的MethodHandle机制,在某种程度上他们的作用是一样的,都是为了解决原有4条invoke*指令方法分派规则固话在虚拟机之中的问题,把如何查找目标方法的决定权从虚拟机转嫁到具体用户代码中,让yoghurt有更高的自由度。

每一处含有invokedynamic指令的位置都称作“动态调用点”,这条指令的第一个参数不再是代表方法符号引用的CONSTANT_Method_info常量,而是变为JDK新加入的CONSTANT_InvokeDynamic_info常量,从这个新常量中可以得到三项信息:引导方法(Bootstrap Method,此方法存放在新增的BootstrapMethods属性中)、方法类型(MethodType)和名称。引导方法是固有的参数,并且返回值是java.lang.invoke.Callsite对象,这个代表真正要执行的目标方法调用。根据CONSTANT_InvokeDynamic_info常量中提供的信息,虚拟机可以找到并执行应到方法,从而获得一个Callsite对象,最终调用要执行的目标方法。

掌控方法分派规则

invokedynamic指令与前面4条“invoke*”指令最大差别就是他的分派逻辑不是由虚拟机决定的,而是与程序员决定的。我们看如下代码:

我们思考在TODO处填入适当代码(不能修改其他地方的代码)实现调用祖父类的thinking方法。。

在java中我们可以通过super关键字很方便的调用到父类中的方法,如果要访问祖父类的方法在JDK1.7以前我们使用纯粹的java语言很难实现这个问题,原因在于Son类的thinking()方法中无法获取一个实际类型是GrandFather的对象引用,而invokevirtual指令的分派逻辑就是按照方法接收者的实际类型进行分派,这个逻辑是固化在虚拟机中的,程序员无法改变。在JDK1.7以后我们可以使用如下方式解决这个问题,代码如下:

java动态语言_java动态类型语言支持(三)相关推荐

  1. 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析

    编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言概念辨析 转自:https://blog.csdn.net/u010533843/article/details/76215487 编译型和解 ...

  2. 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】

    概念区别 [编译型语言与解释型语言.动态类型语言与静态类型语言.强类型语言与弱类型语言] 文章目录 一.编译型语言与解释型语言 二.动态类型语言与静态类型语言 三.强类型语言与弱类型语言 总结 一.编 ...

  3. python中动态语言静态语言的定义_作为程序开发,你所需要知道的编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的概念以及区别...

    作为程序开发,你所需要知道的编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言的概念以及区别! 在各式各样的开发过程当中,我相信各位开发小伙伴在开发过程中并没有太关注什么是解释性语言和编译性语 ...

  4. 强类型语言和弱类型语言;动态语言和静态语言

    动态语言和静态语言 1.动态类型语言:是指在运行期间才去做数据类型检查的语言.在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来.Python和Rub ...

  5. Typescript笔记之基础知识(1):强类型语言和弱类型语言、静态语言和动态语言

    foreword(前言) 这是本人关于Typescript的第一篇笔记,之所以选择将"强类型语言和弱类型语言.静态语言和动态语言"作为第一个想要去总结的主题,是因为个人觉得它很重要 ...

  6. Java 面试题 —— 强类型语言和弱类型语言的区别

    Java 面试题 -- 强类型语言和弱类型语言的区别 ​  强类型语言,也称为强类型定义语言,是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用. ​  如:Jav ...

  7. 言简意赅说明强类型语言、弱类型语言、动态语言、静态语言

    强类型(strong typed.Explicit typed)与弱类型(weakly typed或loosely typed或Implicit typed )的区别可以简单的概括为是否支持隐式转换. ...

  8. python是动态语言还是静态语言?强类型语言还是弱类型语言

    首先要清楚静态类型语言和动态类型语言的判别的标准 定义:如果类型检查发生在编译阶段(compile time),那么是静态类型语言(statically typed languages)中,相反的,如 ...

  9. java与c语言_Java与C语言的区别之我见

    Java 是由C++演变而来的,而C++却是由C 演变而来的,Java与C既有相同 的地方,但是也具备了各自的特点. 一.Java的特点 1.平台独立性 2.面向对象的技术 3.多线程 4.动态性 5 ...

最新文章

  1. Didn't find class net.oschina.app.AppContext on
  2. 聊聊恺明大神MAE的成功之处!
  3. 离职成为自由开发者的第 100 天
  4. [云炬创业学笔记]第三章商业创意的发掘与评估测试1
  5. SRS(simple-rtmp-server)流媒体服务器源码分析--启动
  6. jwt-cli:一个用于解码JSON Web令牌(JWT令牌)的Shell库
  7. linux中追踪函数backtrace调用堆栈
  8. C/C++ atof函数 - C语言零基础入门教程
  9. 如何为企业量身打造一套高可用系统?
  10. nginx查看配置文件nginx.conf路径
  11. T-SQL查询字符串的字节数和字符个数
  12. GIthub创建文件夹、跳转链接、Read.me添加图片和换行显示等操作
  13. 全栈性能测试修炼宝典jmeter实战电子版_推荐一款技术人必备的接口测试神器:Apifox...
  14. console.log(12.toString())为啥会报错呢?
  15. 本地mongochef连接其他计算机上的数据库认证失败解决方法
  16. 取关几十个优质公众号,是否可惜?
  17. -----已搬运-------Linux的/proc/self/学习 ++ CTF例题
  18. Excel文件双击打开后无内容且不可编辑,再次双击文件正常显示
  19. php 7.3 新特性
  20. 会声会影2022智能、快速、简单的视频剪辑软件

热门文章

  1. 深入String、StringBuilder、StringBuffer
  2. AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin
  3. java匿名内部类runnable_Java内部类:匿名内部类(四)
  4. linux fedora14 u盘运行,用U盘安装Fedora的详细步骤
  5. list中抽出某一个字段的值_Java的stream代替List解决单线程等问题
  6. python函数映射教学,Python 序列与映射的解包操作
  7. php集成极光推送,php推送例子(第三方极光推送)
  8. AI学习---卷积神经网络
  9. BZOJ(8) 1053: [HAOI2007]反素数ant
  10. c++ vector注意事项