首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CONSTANT_MethodHandle,CONSTANT_MethodType和CONSTANT_InvokeDynamic是什么?

CONSTANT_MethodHandle,CONSTANT_MethodType和CONSTANT_InvokeDynamic是什么?
EN

Stack Overflow用户
提问于 2014-08-01 20:46:38
回答 2查看 987关注 0票数 4

我在研究Java字节码是如何工作的,于是我开始了维基百科。在专注于文件的.class上,它提到了常量池中出现的11种常量类型。然而,在Java虚拟机规范 (JVMS)中,它又提到了3个:

  • CONSTANT_MethodHandle
  • CONSTANT_MethodType
  • CONSTANT_InvokeDynamic

维基百科页面上提到的11条似乎是不言自明的,我理解它们的目的和用途。然而,我对JVMS中描述的3项额外内容感到困惑。它们是什么,它们被用来做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-02 14:38:26

MethodHandle基本上是可执行操作的“句柄”。它可以是一个方法调用,甚至是一个变量赋值。MethodType是用于调用MethodHandle的调用签名。换句话说,它描述了参数和返回值。MethodHandle可以使用不同类型的签名来处理调用。

要在那里玩,请看java.lang.invoke.MethodHandlejava.lang.invoke.MethodType。当字节码使用最不发达国家将一个MethodHandle_info或MethodType_info常量加载到堆栈中时,JVM分别创建一个MethodHandle或MethodType类实例。

invokedynamic指令将调用一个MethodHandle。引导方法将在第一次调用中使用,以确定它将调用什么MethodHandle。这将创建一个调用指令,该指令可以在运行时更改其调用目标。这允许在目标代码的某些方面发生变化时不需要重新编译的动态代码。这在Java 8中用于提供对lambda表达式的支持。

票数 3
EN

Stack Overflow用户

发布于 2014-08-01 21:03:13

参见Java规范第4章.类文件格式

CONSTANT_MethodHandle_info结构用于表示方法句柄:

代码语言:javascript
复制
CONSTANT_MethodHandle_info {
    u1 tag;
    u1 reference_kind;
    u2 reference_index;
}

CONSTANT_MethodType_info结构用于表示方法类型:

代码语言:javascript
复制
CONSTANT_MethodType_info {
    u1 tag;
    u2 descriptor_index;
}

invokedynamic指令(§invokedynamic)使用CONSTANT_InvokeDynamic_info结构来指定引导方法、动态调用名称、调用的参数类型和返回类型,还可以选择为引导方法指定称为静态参数的附加常量序列。

代码语言:javascript
复制
CONSTANT_InvokeDynamic_info {
    u1 tag;
    u2 bootstrap_method_attr_index;
    u2 name_and_type_index;
}

有关更多信息,请参见方法句柄和发票动态类MethodHandle

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25088414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档