字节码中的 .<init>()V 和 .<init>(Z)V 有什么区别?

9
当我观察我的Java项目字节码时,我看到以下字节码:
java.lang.Object.()V
java.lang.Boolean.(Z)V
"()V"和"(Z)V"的含义是什么?
2个回答

15
java.lang.Object.()V
是一个在java.lang.Object上没有参数的无返回值方法(V)。
java.lang.Boolean.(Z)V
是在java.lang.Boolean上的一个无返回值的方法,它接受一个布尔值 (Z 代表布尔类型,因为 B 代表字节) 参数。

简而言之,

 abc.def.WXYZ(IIIIIIIIIIIIII)J
 ^            ^              ^ 
 target_class argument-types return_type

请参考JNI类型签名获取更多详细信息。

JNI使用Java虚拟机对类型签名进行表示。表3-2展示了这些类型签名。

表3-2 Java虚拟机类型签名

Type Signature             Java Type
Z                          boolean
B                          byte
...
L fully-qualified-class ;  fully-qualified-class
[ type                      type[]
( arg-types ) ret-type      method type

例如,Java 方法:

long f (int n, String s, int[] arr); 

具有以下类型签名:

(ILjava/lang/String;[I)J

4

这是JVM使用的字节码中所有方法签名。

<init>()V<init>(Z)V 是构造函数签名。对于JVM来说,构造函数和其他任何方法一样,都有一个名称,它总是<init>,以及一个返回值,它总是V(表示void)。在我们的情况下,Z 表示布尔参数(B 保留给 byte)。

就是这样。

<init>(Z)V

在Test类的字节码中表示

class Test {

    Test(boolean arg0) {
    }
}

您也可以进行会面。
 static <clinit>()V

这意味着静态初始化块。
static {
...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接