- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在研究 Java 字节码的工作原理,然后我开始研究维基百科。在 the page着眼于.class
文件,它提到了常量池中出现的11种常量类型。然而,在 The Java Virtual Machine Specifications (JVMS) 它又提到了 3 个:
维基百科页面上提到的 11 个似乎不言自明,我理解它们的目的和用途。但是,我对 JVMS 中描述的 3 extra 感到困惑。它们是什么,它们的用途是什么?
最佳答案
MethodHandle 基本上是可执行操作的“句柄”。它可以是方法调用,甚至是变量赋值。 MethodType 是用于调用 MethodHandle 的调用签名。换句话说,它描述了参数和返回值。 MethodHandle 可能能够处理使用不同类型签名调用的过程。
要在那里玩一玩,请查看 java.lang.invoke.MethodHandle
和 java.lang.invoke.MethodType
。这些是在 Java 7 中引入的。当字节码使用 LDC 将 MethodHandle_info 或 MethodType_info 常量加载到堆栈上时,JVM 会分别创建一个 MethodHandle 或 MethodType 类实例。
invokedynamic 字节码指令将调用 MethodHandle。 Bootstrap 方法将在第一次 调用中使用,以确定它将调用什么 MethodHandle。这将创建一个可以在运行时更改其调用目标的调用指令。这允许动态代码在其目标代码的某些方面发生变化时不需要重新编译。这在 Java 8 中用于提供对 lambda 表达式的支持。
关于java - 什么是 CONSTANT_MethodHandle、CONSTANT_MethodType 和 CONSTANT_InvokeDynamic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088414/
我正在研究 Java 字节码的工作原理,然后我开始研究维基百科。在 the page着眼于.class文件,它提到了常量池中出现的11种常量类型。然而,在 The Java Virtual Machi
我是一名优秀的程序员,十分优秀!