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

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

作者: gzss | 来源:发表于2019-08-04 15:18 被阅读0次

java.lang.invoke 包

在JDK1.7发布之后引入了java.lang.invoke包,它是JSR-292的一个重要组成部分,这个包的主要目的实在之前单纯的依靠符号引用来去定调用的目标方法这种方式以外,提供一种新的动态确定目标方法的机制,成为MethodHandle。在此之前java语言没有办法单独的把一个函数作为参数传递。普遍的做法是设计一个带有某个方法的接口比如(带有compare()方法的Comparator接口),已实现了这个接口的对象作为参数,例如Clooections.sort()就是这样定义的,void sort(List list, Comparator c).

如下代码展示MethodHandle的基本用途,无论obj是何种类型(临时定义的ClassA或者是实现PrintStream接口的实现类System.out),都可以正确的调用到println()方法。

实际上,方法getPrintlnMH()模拟了invokevirtual指令的智行过程,只不过他的分派逻辑并非固话在Class文件的字节码上,而是通过一个具体方法来实现。而这个方法本身的返回值(MethodHandle对象),可以视为对最终调用方法的一个引用。以此为基础,有了MethodHandle对象就可以写出类似于下面这样的函数声明:
void sort(List list, MethodHandle compare)

从上面的例子可以看出,使用MethodHandle并没有什么困难,不过看完他的用法之后,我们可能会有疑问,相同的事情,用反射也可以实现。仅站在java的角度,MethodHandle的使用方法和效果与Reflection有众多相似之处,不过他们也有一些去表:

1、从本质上讲,Reflection和MethodHandle机制都是在模拟方法调用,但是Reflection实在模拟java到吗层次的方法调用,而MethodHandle实在模拟字节码层次的方法调用。在MethodHandles.lookup中的三个方法fundStatic(),findVirtual(),fundSpecial()正式为了对应invokestatic,invokevirtual&invokeinterface和invokespecial这几条字节码指令的执行权限校验行为,而这些底层细节在使用Reflection API时是不需要关心的。

2、Reflection中的java.lang.reflect.Method对象远比MethodHandle机制中的java.lang.invoke.MethodHandle对象所包含的信息多,前者是方法在java一段的全面映射,包含了方法的签名,描述符以及方法属性表中各种属性的java端表示方式,还包含智行权限等的运行期信息,而后者仅仅包含与智行该方法相关的信息。用通俗的话讲,Reflection是重量级,而MethodHandle是轻量级。

3、由于MethodHandle是对字节码的方法指令调用的模拟,所以理论上虚拟机在这方面做得各种优化(如方法内联),在MethodHandle上也应当可以采用类似思路去支持,通过反射去调用方法则不行。

相关文章

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

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

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

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

  • Groovy<第一篇>:Groovy 前言

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

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

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

  • 动态语言

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

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

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

  • 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/dufydctx.html