Tag: invokedynamic

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 9中如何实现string连接?

正如JEP 280所写: 将由javac生成的静态String -concatenation字节码序列更改为对JDK库函数使用invokedynamic调用。 这将使未来优化String连接,而不需要进一步修改由javac提供的字节码。 在这里,我想了解invokedynamic调用的用法,以及字节码级联与invokedynamic不同之处是什么?

什么是invokedynamic,如何使用它?

我一直听到所有正在添加到JVM中的新酷function,其中一个很酷的function是invokedynamic。 我想知道它是什么,以及它如何使Java中的reflection编程更容易或更好?