MethodHandle-这是什么一回事?
我正在研究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语言本身。
我读完上面的链接,从那里引用一些:
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指令。
以上是 MethodHandle-这是什么一回事? 的全部内容, 来源链接: utcz.com/qa/400958.html