相关疑难解决方法(0)

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语言本身.

更新-2:我读完了上面的链接,从那里引用了一些引文:

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

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

...反射调用比直接调用慢很多.多年来,JVM已经非常擅长快速反映调用.现代JVM实际上在幕后生成了一堆代码,以避免处理大量开销的旧JVM.但简单的事实是,通过任意数量的层反射访问总是比直接调用慢,部分原因是完全通用的"调用"方法必须检查并重新检查接收器类型,参数类型,可见性和其他细节,但因为参数必须都是对象(所以原语是对象框),并且必须作为一个数组提供,以涵盖所有可能的arities(所以参数得到数组框).

对于执行少量反射调用的库,性能差异可能无关紧要,特别是如果这些调用主要是为了在内存中动态设置静态结构,可以进行正常调用.但是在动态语言中,每次调用必须使用这些机制,这是一个严重的性能损失.

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

因此,对于Java程序员来说,它基本上是无用的.我对吗?从这个角度来看,它只能被视为Core Reflection API的替代方式.

java jvm invokedynamic java-7 methodhandle

47
推荐指数
4
解决办法
1万
查看次数

关于MethodHandle API的一些基本问题

如何通过MethodHandles.lookup()?获取所有声明的方法?如何获取所有声明的字段?

什么是差异MethodHandle.invoke(),MethodHandle.invokeExact()MethodHandle.invokeWithArguments()

此外,我将非常感谢有关使用Methodhandle API for Java devloper的教程.我强调,我正在编写静态类型语言普通旧Java,我不是JVM开发人员,特别是我对整个字节码废话(invokedynamic)并不感兴趣.我想弄清楚如何使用这个新API而不是Java Core API.

EDITED-2:

@Glen Best下面提供了一些我只想提供的参考资料http://www.oraclejavamagazine-digital.com/javamagazine/20130102?pg=52&search_term=methodhandle&doc_id=-1#pg50这正是我想要的.我发现实际上有一些新的词汇表.例如,目标实际上是指MethodHandle(而不是发送的对象),而调用站点实际上是"调用""函数指针"又称MethodHandle的代码.此外,它是一定要了解MethodHandle API是不是更换为核心映像API,而不是suplement它.例如,您无法使用MethodHandle"发现"所有方法,而您需要Core Reflection API.但是当你"找到"你想要的方法时,你可以切换到MethodHandle,例如,绑定一些参数或者将它的签名"改变"(改编)为varargs.

编辑:

我仍在努力找出答案.我写了一些我想与大家分享的测试.

package alexander.berkovich;

import static org.junit.Assert.assertSame;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.BeforeClass;
import org.junit.Test;

public class MethodHandlerCleanTest {

    public static MethodHandles.Lookup lookup;

    @BeforeClass
    public static void asetUp(){
        lookup = MethodHandles.lookup();
    }

    public static class Check {
        public void primitive(final int …
Run Code Online (Sandbox Code Playgroud)

java reflection java-7

21
推荐指数
2
解决办法
9171
查看次数

标签 统计

java ×2

java-7 ×2

invokedynamic ×1

jvm ×1

methodhandle ×1

reflection ×1