Lho*_*Ben 7 java classloader jls
在阅读有关类加载器的内容时,我遇到了二进制名称的概念,但我不太理解它。
您能否解释一下 java 类的二进制名称是什么以及为什么 package + className 不够(我猜是因为内部类,但这是唯一的原因)?谢谢
内部类并不是唯一的原因;本地类、匿名类和类型变量也有二进制名称。
\n来自 Java 语言规范 ( \xc2\xa713.1 ):
\n\n\n类或接口必须以其二进制名称命名,并且必须满足以下约束:
\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这样做的一个很好的理由是两个类可以具有相同的规范名称:例如,规范名称可以是名为的包中命名的A.B类,或者是声明为默认包中命名的类的内部类的名为 的类。这两个类的二进制名称分别是和。BABAA.BA$B
另一个原因是某些类根本没有规范名称 - 例如,“本地类没有规范名称”。(\xc2\xa76.7)。
\n| 归档时间: |
|
| 查看次数: |
2417 次 |
| 最近记录: |