我在研究Java字节码是如何工作的,于是我开始了维基百科。在专注于页文件的.class上,它提到了常量池中出现的11种常量类型。然而,在Java虚拟机规范 (JVMS)中,它又提到了3个:
维基百科页面上提到的11条似乎是不言自明的,我理解它们的目的和用途。然而,我对JVMS中描述的3项额外内容感到困惑。它们是什么,它们被用来做什么?
发布于 2014-08-02 14:38:26
MethodHandle基本上是可执行操作的“句柄”。它可以是一个方法调用,甚至是一个变量赋值。MethodType是用于调用MethodHandle的调用签名。换句话说,它描述了参数和返回值。MethodHandle可以使用不同类型的签名来处理调用。
要在那里玩,请看java.lang.invoke.MethodHandle和java.lang.invoke.MethodType。当字节码使用最不发达国家将一个MethodHandle_info或MethodType_info常量加载到堆栈中时,JVM分别创建一个MethodHandle或MethodType类实例。
invokedynamic指令将调用一个MethodHandle。引导方法将在第一次调用中使用,以确定它将调用什么MethodHandle。这将创建一个调用指令,该指令可以在运行时更改其调用目标。这允许在目标代码的某些方面发生变化时不需要重新编译的动态代码。这在Java 8中用于提供对lambda表达式的支持。
发布于 2014-08-01 21:03:13
参见Java规范第4章.类文件格式
CONSTANT_MethodHandle_info结构用于表示方法句柄:
CONSTANT_MethodHandle_info {
u1 tag;
u1 reference_kind;
u2 reference_index;
}CONSTANT_MethodType_info结构用于表示方法类型:
CONSTANT_MethodType_info {
u1 tag;
u2 descriptor_index;
}invokedynamic指令(§invokedynamic)使用CONSTANT_InvokeDynamic_info结构来指定引导方法、动态调用名称、调用的参数类型和返回类型,还可以选择为引导方法指定称为静态参数的附加常量序列。
CONSTANT_InvokeDynamic_info {
u1 tag;
u2 bootstrap_method_attr_index;
u2 name_and_type_index;
}有关更多信息,请参见方法句柄和发票动态和类MethodHandle
https://stackoverflow.com/questions/25088414
复制相似问题