MethodHandle – 这是关于什么的?
我正在研究JDK 1.7的新function,而我无法得到MethodHandle的devise目的? 我理解(直接)调用静态方法(以及在这种情况下直接使用Core Reflection API)。 我也理解(直接)调用虚拟方法(非静态,非最终)(以及使用需要通过Class的层次结构obj.getClass().getSuperclass()
)的Core Reflection API。 非虚拟方法的调用可以视为前者的特例。
是的,我意识到超载有一个问题。 如果你想调用方法,你必须提供确切的签名。 您不能以简单的方式检查重载的方法。
但是,什么是MethodHandle呢? Reflection API允许你在没有任何预先假设的情况下(比如实现接口)“查看”对象内部。 你可以检查对象的目的。 但MethodHandle的devise是什么? 为什么和什么时候应该使用它?
更新:我正在阅读这篇http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html文章。 据此,主要目标是简化运行在JVM之上的脚本语言的生活,而不是为Java语言本身。
更新-2:我完成阅读上面的链接,从那里一些报价:
JVM将成为构builddynamic语言的最佳VM,因为它已经是一个dynamic语言VM。 而通过将dynamic语言提升为一stream的JVM公民,InvokeDynamic将certificate这一点。
使用reflection来调用方法效果很好,除了一些问题。 方法对象必须从特定的types中检索,并且不能以一般的方式创build<…>
反映的调用比直接调用要慢很多。 多年来,JVM已经非常善于快速反映调用。 现代的JVM实际上在幕后产生了一堆代码,以避免大部分旧JVM处理的开销。 但简单的事实是,通过任意数量的层来反映访问总是比直接调用慢,部分原因是完全基因化的“调用”方法必须检查和重新检查接收者types,参数types,可见性和其他细节,但也因为参数必须全部是对象(所以原语获得对象框),必须提供作为一个数组,以涵盖所有可能的arities(所以参数获得数组盒)。
性能上的差异对于一个库进行一些reflection调用可能并不重要,特别是如果这些调用主要是dynamic地在内存中build立一个静态结构,可以进行正常的调用。 但是在dynamic的语言中,每次调用都必须使用这些机制,这是一个严重的性能问题。
http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html
所以,对于Java程序员来说,它本质上是无用的。 我对吗? 从这个angular度来看,它只能被视为Core Reflection API的替代方式。
这是Java 8为MethodHandles提供语言支持的先决条件。 你将能够直接引用一个方法,MethodHandles将会支持这个方法。
MethodHandles可以做什么是咖喱方法,改变参数的types和改变它们的顺序。
方法句柄可以处理方法和字段。
MethodHandles所做的另一个技巧是使用原始直接(而不是通过包装)
MethodHandles可以比使用reflection更快,因为在JVM中有更直接的支持,例如可以内联。 它使用新的invokedynamic指令。
java.lang.reflect.Method
在内存方面相对较慢并且代价很高。 方法句柄应该是一个“轻量级”的方式,将指针传递给JVM有可能优化的函数。 从JDK8的方法句柄没有那么好的优化,lambda可能最初被实现在类的方面(作为内部类)。
把MethodHandle想象成一个现代的,更灵活,更安全的反思方法。
目前它正处于其生命周期的早期阶段 – 但是随着时间的推移,它有可能被优化成必须快于反思,才能变得像常规方法一样快。