当我观察我的Java项目字节码时,我看到以下字节码:
java.lang.Object.()V
java.lang.Boolean.(Z)V
"()V"和"(Z)V"的含义是什么?
java.lang.Object.()V
java.lang.Boolean.(Z)V
"()V"和"(Z)V"的含义是什么?
是一个在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
这是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 {
...
}