为什么L是引用类型的前缀(而不是其他一些字母)?

时间:2015-09-24 18:04:03

标签: java

为什么选择L作为签名类型中引用的前缀? L代表什么,B代表byteI代表int?或者之所以选择它是因为C已分配给char

例如,

System.out.println( new String[0].getClass().getName() );

收率:

[Ljava.lang.String;

我已经知道Java specClass.getName method javadoc中的解释。

3 个答案:

答案 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?