JVM规范(五)特定方法

来源:互联网 发布:sql字符串中的单引号 编辑:程序博客网 时间:2024/06/05 09:23

Special Method

Instance Initialization Methods(实例初始化方法)

一个类可以有0个或者多个实例初始化方法,每个通常都对应一个用java程序语言编写的构造器。

如果满足以下条件可看作是一个实例初始化方法:

  • 在类中定义,而非接口。
  • 它有专有名字init.
  • 它返回空

在一个类中,其他命名为init的方法不是实例初始化方法。在一个接口,任何一个名字为init的方法都不是实例初始化方法。这些方法不能被java虚拟机指令调用,其在格式检查时被拒绝。

一个实例初始化方法的声明与使用是受Java虚拟机的约束的。对于其声明,方法的access_flags项和code数组是受约束的,对于其使用,一个实例初始个方法仅会被invokespecial指令在未初化的类实例上调用。

注:因为方法名init在java程序语言中不是个有效的标识符,它不能再使用java程序语言的程序中直接书写。

Class Initialization Methods

一个类或者接口至少有一个类或者实例初始化方法,且其初始化是通过Java虚拟机调用那个方法完成。

如果满足以下条件则是一个类或者接口初始化方法:

  • 名字为cinit.
  • 返回空
  • 在一个class文件中,版本号为51.0或者更高,方法拥有ACC_STATIC标志集且没有参数。

class文件中其他名字为cinit的方法不是类或者接口初始化方法,它们从不会被Java虚拟机自身调用,也不会被虚拟机指令调用,会在格式检查时被拒绝。

注:cinit同样不能在使用Java程序语言编写的程序中使用。

Signature Polymorphic Methods

一个方法满足如下条件为signature(签名) polymorphic(多态的):

  • 在java.lang.invoke.MethodHandle类或者java.lang.invoke.VarHandle类中声明。
  • 拥有单一格式的Object数组类型的参数。
  • 拥有ACC_VARARGS和ACC_NATIVE标志集。

Java虚拟机在invokevirtual指令中对Signature Polymorphic方法特殊对待,目的是达到方法句柄的调用或者被指向java.lang.invoke.VarHandle实例的变量的访问的目的。

一个方法句柄是动态强类型的且直接可执行的引用底层方法、构造函数、域(field)、或者类似的带有可选的参数传递和结果返回的底层操作。一个java.lang.invoke.VarHandle实例对一个变量或者变量簇,包括静态域、非静态域、数组元素或者堆外数据结构的动态强类型引用。可以查看SE平台API中的java.lang.invoke包查看查阅更多信息。