http://www.ibm.com/developerworks/cn/java/j-cwt02076.html (参考)
Java 平台中的类总是来自某些包。当您在 Java 源代码中引用类名称时,您或许会也或许不会真正将包限定作为名称的一部分。您总是可以包含包限定(形如 java.lang.String),但您也可以为了省事而忽略它 —— 如果类来自 java.lang包或已 import到源文件中。这种包含包限定的类名称结构就称为 “完全限定” 类名。
在实际的
二进制类内部,类名称总是在一个包中指定的。但这种名称的格式与 Java 源代码中的完全限定类名略有差别,使用正斜杠 (“/”) 取代圆点 (“.”)。例如,在 String类中,名称的内部形式为 java/lang/String。如果您尝试将一个类文件作为文本输出或查看,那么通常会看到上述形式的多个字符串,每个字符串都是对某个类的引用。
采用这种内部形式的类引用是作为字段和方法描述符的一部分使用的。字段描述符指定类中定义的一个类的准确类型。所使用的表示法取决于字段是简单对象类型、简单原语类型还是数组类型。简单对象类型的表示法为,以 ‘L’ 开头,后接对象类名称的内部形式,以 ‘;’ 结尾。原语类型的表示法为,各类型使用一个单独的字母(如 ‘I’ 表示 int、‘Z’ 表示布尔型)。数组类型的表示法为,以 ‘[’ 作为数组项类型(其本身也可为数组类型)的前缀修饰符。表 1 给出了关于各字段描述符的示例,另外还列出了相应的 Java 源代码声明:
表 1. 字段描述符示例
描述符 源代码Ljava/lang/String; StringI int[Ljava/lang/Object; Object[][Z boolean[][[Lcom/sosnoski/generics/FileInfo; com.sosnoski.generics.FileInfo[][]
方法描述符
结合了字段描述符,以指定方法的参数类型和返回类型。方法描述符的格式非常易于
理解。以 ‘(’ 开始,后接参数的字段描述符(均一起运行),随后是 ‘)’,最后以返回类型结尾(若返回类型为 void,则以 ‘V’ 结尾)。表 2 给出了方法描述符的一些示例,同时还列出了相应的 Java 源代码声明(注意方法名称和参数名称本身并非方法描述符的一部分,所以在表中使用了占位符):
表 2. 方法描述符示例
描述符 源代码(Ljava/lang/String;)I int mmm(String x)(ILjava/lang/String;)V void mmm(int x, String y)(I)Ljava/lang/String; String mmm(int x)(Ljava/lang/String;)[C char[] mmm(String x)(ILjava/lang/String;[[Lcom/sosnoski/generics/FileInfo;)V void mmm(int x, String y, FileInfo[][] z)
Java type and corresponding type signature
List<E> Ljava/util/List<TE;>;List<?> Ljava/util/List<*>;List<? extends Number> Ljava/util/List<+Ljava/lang/Number;>;List<? super Integer> Ljava/util/List<-Ljava/lang/Integer;>;List<List<String>[]> Ljava/util/List<[Ljava/util/List<Ljava/lang/String;>;>;HashMap<K, V>.HashIterator<K> Ljava/util/HashMap<TK;TV;>.HashIterator<TK;>;static <T> Class<? extends T> m (int n) <T:Ljava/lang/Object;>(I)Ljava/lang/Class<+TT;>;C<E> extends List<E> <E:Ljava/lang/Object;>Ljava/util/List<TE;>;