我一直在研究Java字节码的工作方式,然后从Wikipedia开始。在关注.class文件的the page上,它提到了出现在“常量池”中的11种常量类型。但是,在The Java Virtual Machine Specifications(JVMS)中,它又提到了3个:

  • CONSTANT_MethodHandle
  • CONSTANT_MethodType
  • CONSTANT_Invoke动态

  • Wikipedia页面上提到的11似乎很不言自明,我了解它们的目的和用途。但是,我对JVMS中描述的3个额外功能感到困惑。它们是什么,以及它们的用途是什么?

    最佳答案

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

    要在那里玩耍,请查看java.lang.invoke.MethodHandlejava.lang.invoke.MethodType。这些是在Java 7中引入的。当字节码使用LDC将MethodHandle_info或MethodType_info常量加载到堆栈上时,JVM将分别创建MethodHandle或MethodType类实例。

    invokedynamic字节码指令将调用MethodHandle。 bootstrap方法将在第一次调用时使用,以确定它将调用什么MethodHandle。这将创建一个可以在运行时更改其调用目标的调用指令。这样,当目标代码的某些方面发生更改时,动态代码便无需重新编译。 Java 8中使用它来提供对lambda表达式的支持。

    09-25 20:27