当前位置: 首页 > 面试题库 >

MethodHandle-这是什么一回事?

郁鸿博
2023-03-14
问题内容

我正在研究JDK 1.7的新功能,但我无法了解MethodHandle是为什么设计的?我了解静态方法的(直接)调用(以及在这种情况下简单的Core
Reflection API的使用)。我也了解(直接)调用虚拟方法(非静态,非最终)(以及使用需要经过Class层次结构的Core Reflection
API obj.getClass().getSuperclass())。非虚拟方法的调用可以视为前一种的特殊情况。

是的,我知道重载存在问题。如果要调用方法,则必须提供确切的签名。您无法通过简单的方法检查重载方法。

但是,MethodHandle是关于什么的?Reflection
API允许您“查看”对象内部,而无需任何预先假设(例如实现接口)。您可以出于某些目的检查对象。但是MethodHandle也是设计什么的?为什么以及何时应该使用它?

更新: 我正在阅读这篇http://blog.headius.com/2008/09/first-taste-of-
invokedynamic.html文章。据此,主要目标是简化在JVM之上运行的脚本语言的寿命,而不是Java语言本身。

UPDATE-2: 我读完上面的链接,从那里引用一些:

JVM将成为构建动态语言的最佳VM,因为它已经是动态语言VM。InvokeDynamic通过将动态语言推广给一流的JVM公民,将证明这一点。

使用反射来调用方法效果很好…除了一些问题。方法对象必须从特定类型中检索,并且不能以常规方式创建。<…>

…反映的调用比直接调用要慢得多。多年来,JVM确实非常擅长快速进行反射调用。现代JVM实际上在幕后生成了一堆代码,以避免处理许多旧JVM的开销。但简单的事实是,通过任何数量的层进行的反射访问始终比直接调用要慢,部分原因是完全生成的“调用”方法必须检查并重新检查接收者类型,参数类型,可见性和其他详细信息,但是也因为参数必须全部是对象(因此,原语会被对象装箱),并且必须以数组形式提供以涵盖所有可能的参数(因此参数会被数组装箱)。

对于执行几次反射调用的库,性能差异可能并不重要,尤其是如果那些调用主要是为了在内存中动态建立可以对其进行常规调用的静态结构。但是在动态语言中,每个调用都必须使用这些机制,这对性能造成了严重影响。

http://blog.headius.com/2008/09/first-taste-of-
invokedynamic.html

因此,对于Java程序员而言,它实际上是没有用的。我对吗?从这个角度来看,它只能被视为Core Reflection API的替代方法。


问题答案:

使用MethodHandles可以执行的操作是咖喱方法,更改参数的类型并更改其顺序。

方法句柄可以处理方法和字段。

MethodHandles的另一个技巧是使用原始直接方法(而不是通过包装器)

MethodHandles可能比使用反射更快,因为JVM中有更多直接支持,例如可以内联。它使用新的invokedynamic指令。



 类似资料:
  • 问题内容: 当我调用toString从函数调用中收到的对象时,会得到此信息。我知道对象的类型编码在此字符串中,但是我不知道如何读取它。 这种编码称为什么类型? 问题答案: ;是的名称代表的数组的类。 命名方案记录在: 如果该类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如Java语言规范(§13.1)所指定。 如果此类对象表示原始类型或void,则返回的名称是与原始类型或对应的Java

  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?

  • 问题内容: 我是Go的新手,在浏览其他一些线程时遇到了以下代码行: 含义是什么?它是否指定将在if条件中分配某些内容(因为err似乎正在发生这种情况)?我在Wiki上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的

  • 因此,我想要一个代码,使我的HTML列表在冒号之前加粗。所以我搜索了一个我选择使用的代码。在堆栈溢出中看到一个代码:https://stackoverflow.com/a/46855744/15163136.我没有使用for循环,而是使用foreach循环。 但唯一的问题是我不理解和

  • 我正在看宣传单。 在setTimeout中调用

  • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?