我正在研究JDK 1.7的新功能,而我无法了解MethodHandle是为什么设计的? 我了解静态方法的(直接)调用(以及在这种情况下简单的Core Reflection API的使用)。 我也了解(直接)调用虚拟方法(非静态,非最终)(以及使用需要通过Class层次结构obj.getClass().getSuperclass()的Core Reflection API的调用)。 调用非虚拟方法可以视为前一种的特殊情况。
是的,我知道重载存在问题。 如果要调用方法,则必须提供准确的签名。 您无法通过简单的方法检查重载方法。
但是,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.和阿丢失.com/2008/09/first-taste-of-invoke dynamic.HTML]
因此,对于Java程序员而言,它实际上是没有用的。 我对吗? 从这个角度来看,它只能被视为Core Reflection API的替代方法。