虽然阅读有关类加载器的信息,但我遇到了二进制名称的概念,但是我不太了解它。
您能解释一下Java类的二进制名称是什么,为什么包+ className不足(我想是因为有内部类,但这是唯一的原因)?谢谢
内部类不是唯一的原因;本地类,匿名类和类型变量也具有二进制名称。
摘自Java语言规范(§13.1):
类或接口必须以其二进制名称命名,该名称必须满足以下约束:
顶级类型的二进制名称(§7.6)是其规范名称(§6.7)。
成员类型的二进制名称(第8.5节,第9.5节)由其直接封闭类型的二进制名称组成,后跟$,后跟成员的简单名称。
本地类的二进制名称(第14.3节)由其立即封闭类型的二进制名称组成,后跟$,后跟一个非空数字序列,后跟该本地类的简单名称。
匿名类的二进制名称(第15.9.5节)由其立即封闭类型的二进制名称组成,后跟$,后跟一个非空数字序列。
由通用类或接口声明的类型变量的二进制名称(第8.1.2节,第9.1.2节)是其直接封闭类型的二进制名称,后跟$,后跟简单名称类型变量。
泛型方法声明的类型变量的二进制名称(第8.4.4节)是声明该方法的类型的二进制名称,后跟$,然后是方法的描述符(JVMS第4.3.3节) ),然后是$,然后是类型变量的简单名称。
通用构造函数声明的类型变量的二进制名称(第8.8.4节)是声明构造函数的类型的二进制名称,后跟$,后跟构造函数的描述符(JVMS§4.3.3) ),然后是$,然后是类型变量的简单名称。
关于二进制名称,在同一部分中给出:
对另一个类或接口类型的引用必须是符号,使用该类型的二进制名称。
即,在已编译的字节码类中,它们的二进制名称而不是其规范名称被引用。
一个很好的理由是,两个类可以具有相同的规范名称:例如,规范名称A.B
可以是名为B
的程序包中名为A
的类,也可以是名为B
的类在默认包中声明为名为A
的类的内部类。这两个类的二进制名称分别为A.B
和A$B
。
另一个原因是某些类根本没有规范名称-例如,“本地类没有规范名称。”(§6.7)。