美文网首页
java动态类型语言支持(三)

java动态类型语言支持(三)

作者: gzss | 来源:发表于2019-08-06 23:39 被阅读0次

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动态类型语言支持(三)

    invokedynamic指令 在前面java动态类型语言支持(一)(二)中我们有提到invokedynamic指...

  • java动态类型语言支持(一)

    动态类型语言 随着JDK1.7的发布,字节码指令集迎来了一个新成员-invokedynamic指令,这条指令视为了...

  • java动态类型语言支持(二)

    java.lang.invoke 包 在JDK1.7发布之后引入了java.lang.invoke包,它是JSR-...

  • 动态语言

    Java SE 6 新特性-对脚本语言的支持 动态调用动态语言,第 1 部分-引入 Java 脚本 API 动态调...

  • 学习一门新语言首先要了解的知识

    1.语言的类型模型是什么? 强类型(Java)或弱类型(C语言),静态类型(Java)或动态类型(Ruby) 2....

  • Groovy<第一篇>:Groovy 前言

    Groovy是一种基于Java平台的面向对象语言。 [Groovy的特点] [一] 同时支持静态和动态类型。[二]...

  • centos安装groovy环境

    Groovy是一种功能强大,可选类型和动态 语言,支持Java平台。最近在研究Jenkins的Pipeline,其...

  • Python 变量 ,对象,引用

    动态类型 C,C++和Java是静态编译型语言,Python属于动态类型的语言,类型实在运行过程中自动决定的,而不...

  • java反射

    什么是java反射机制 动态语言 当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。 静态语言 静态...

  • [C++11阅读][3-2-1]auto类型推导(上)

    静态类型、动态类型 C/C++是静态类型语言,在编译时进行类型检查。后来一些新兴的语言,比如Python、Java...

网友评论

      本文标题:java动态类型语言支持(三)

      本文链接:https://www.haomeiwen.com/subject/zpfydctx.html