为什么选择L
作为签名类型中引用的前缀? L
代表什么,B
代表byte
,I
代表int
?或者之所以选择它是因为C
已分配给char
?
例如,
System.out.println( new String[0].getClass().getName() );
收率:
[Ljava.lang.String;
我已经知道Java spec和Class.getName method javadoc中的解释。
答案 0 :(得分:5)
此字符源自JVM内部签名和类名表示。
请参阅JVM Specification §4.3.2. Field Descriptors:
B byte signed byte C char Unicode character code point in the Basic Multilingual Plane, encoded with UTF-16 D double double-precision floating-point value F float single-precision floating-point value I int integer J long long integer L ClassName ; reference an instance of class ClassName S short signed short Z boolean true or false [ reference one array dimension
数组类型包含每个维度的[
,后跟其元素签名,例如[I
int[]
。同样地,Object[]
在内部由[Ljava/lang/Object;
表示。
看来,当从内部类名称转换为应用程序可见名称(即由Class.getName()
返回)首次实现时,它实现为仅将/
转换为.
但无需关心对于数组表示法。后来因兼容性原因没有改变。
请注意,Java 8引入了getTypeName()
来解决问题,即String[].class.getTypeName()
产生java.lang.String[]
。
答案 1 :(得分:0)
“[”是数组的维度。所以“[”是一维数组,“[[”是一个二维数组,等等。
“Ljava.lang.String”表示它是类java.lang.String的对象数组(即“L”)。
如果你有一组基元,比如说int
,那就是“[我”。其他原始类型有不同的字母。
答案 2 :(得分:-2)
[Ljava.lang.String;
这里[表示一个数组。 L表示java.lang.String类型的类。这些是JVM为识别Java数据类型而保留的快捷方式。这类似于字节码内部使用的类型描述符。例如,对于基元,值为:[I for int of int,二维数组将为:[[I。
以下是一个非常好的解释:[L array notation - where does it come from?