gpt4 book ai didi

java - [L 数组表示法——它从何而来?

转载 作者:IT老高 更新时间:2023-10-28 11:48:09 28 4
gpt4 key购买 nike

我经常看到使用 [L 然后使用类型来表示数组的消息,例如:

[Ljava.lang.Object;无法转换为 [Ljava.lang.String;

(上面是我刚刚提取的任意示例。)我知道这表示一个数组,但是语法来自哪里?为什么开始 [ 但没有右方括号?为什么是L?这纯粹是武断的还是背后有其他历史/技术原因?

最佳答案

[代表Array,Lsome.type.Here;代表数组的类型。这类似于在§4.3 of the Java Virtual Machine Specification 中看到的字节码内部 中使用的类型描述符。 -- .唯一的区别在于 real 描述符使用 / 而不是 . 来表示包。

例如,对于原语,值是:[I 对于整数数组,二维数组将是:[[I(严格来说,Java 没有'没有真正的二维数组,但你可以制作由数组组成的数组。

由于类可能有任何名称,因此很难识别它是什么类,因此它们用 L 分隔,后跟类名并以 ; 结尾>

描述符也用于表示字段和方法的类型。

例如:

(IDLjava/lang/Thread;)Ljava/lang/Object;

...对应一个方法,参数为intdoubleThread,返回类型为Object

编辑

您也可以使用 java dissambler 在 .class 文件中看到这一点

C:>more > S.java
class S {
Object hello(int i, double d, long j, Thread t ) {
return new Object();
}
}
^C
C:>javac S.java

C:>javap -verbose S
class S extends java.lang.Object
SourceFile: "S.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #2.#12; // java/lang/Object."<init>":()V
const #2 = class #13; // java/lang/Object
const #3 = class #14; // S
const #4 = Asciz <init>;
const #5 = Asciz ()V;
const #6 = Asciz Code;
const #7 = Asciz LineNumberTable;
const #8 = Asciz hello;
const #9 = Asciz (IDJLjava/lang/Thread;)Ljava/lang/Object;;
const #10 = Asciz SourceFile;
const #11 = Asciz S.java;
const #12 = NameAndType #4:#5;// "<init>":()V
const #13 = Asciz java/lang/Object;
const #14 = Asciz S;

{
S();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0


java.lang.Object hello(int, double, long, java.lang.Thread);
Code:
Stack=2, Locals=7, Args_size=5
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: areturn
LineNumberTable:
line 3: 0


}

在原始类文件中(看第 5 行):

enter image description here

引用:Field description on the JVM specification

关于java - [L 数组表示法——它从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085889/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com