java语言规范上下文中的“类的二进制名称”是什么?

Lho*_*Ben 7 java classloader jls

在阅读有关类加载器的内容时​​,我遇到了二进制名称的概念,但我不太理解它。

您能否解释一下 java 类的二进制名称是什么以及为什么 package + className 不够(我猜是因为内部类,但这是唯一的原因)?谢谢

kay*_*ya3 5

内部类并不是唯一的原因;本地类、匿名类和类型变量也有二进制名称。

\n

来自 Java 语言规范 ( \xc2\xa713.1 ):

\n
\n

类或接口必须以其二进制名称命名,并且必须满足以下约束:

\n
    \n
  • 顶级类型的二进制名称 (\xc2\xa77.6) 是其规范名称 (\xc2\xa76.7)。

    \n
  • \n
  • 成员类型的二进制名称(\xc2\xa78.5、\xc2\xa79.5)由其直接封闭类型的二进制名称、$ 和成员的简单名称组成。

    \n
  • \n
  • 本地类的二进制名称 (\xc2\xa714.3) 由其直接封闭类型的二进制名称、$、非空数字序列和本地类的简单名称组成。

    \n
  • \n
  • 匿名类的二进制名称 (\xc2\xa715.9.5) 由其直接封闭类型的二进制名称组成,后跟 $,后跟非空数字序列。

    \n
  • \n
  • 由泛型类或接口声明的类型变量的二进制名称(\xc2\xa78.1.2、\xc2\xa79.1.2)是其直接封闭类型的二进制名称,后跟 $,后跟该类型的简单名称类型变量。

    \n
  • \n
  • 泛型方法声明的类型变量的二进制名称 (\xc2\xa78.4.4) 是声明该方法的类型的二进制名称,后跟 $,后跟该方法的描述符 (JVMS \xc2\xa74.3.3 ),后面是 $,后面是类型变量的简单名称。

    \n
  • \n
  • 泛型构造函数声明的类型变量的二进制名称 (\xc2\xa78.8.4) 是声明构造函数的类型的二进制名称,后跟 $,后跟构造函数的描述符 (JVMS \xc2\xa74.3.3 ),后面是 $,后面是类型变量的简单名称。

    \n
  • \n
\n
\n

至于二进制名称的用途,在同一部分中给出:

\n
\n

对另一个类或接口类型的引用必须是符号的,使用类型的二进制名称。

\n
\n

也就是说,在编译的字节码中,类是通过它们的二进制名称来引用的,而不仅仅是它们的规范名称。

\n

这样做的一个很好的理由是两个类可以具有相同的规范名称:例如,规范名称可以是名为的包中命名的A.B类,或者是声明为默认包中命名的类的内部类的名为 的类。这两个类的二进制名称分别是和。BABAA.BA$B

\n

另一个原因是某些类根本没有规范名称 - 例如,“本地类没有规范名称”。\xc2\xa76.7)。

\n