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

问题描述 投票:1回答:1

虽然阅读有关类加载器的信息,但我遇到了二进制名称的概念,但是我不太了解它。

您能解释一下Java类的二进制名称是什么,为什么包+ className不足(我想是因为有内部类,但这是唯一的原因)?谢谢

java classloader jls
1个回答
1
投票

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

摘自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.BA$B

另一个原因是某些类根本没有规范名称-例如,“本地类没有规范名称。”§6.7)。

© www.soinside.com 2019 - 2024. All rights reserved.