CONSTANT_Class_info结构的项目如下: tag 标记项的值为CONSTANT_Class(7)。 name_index name_index项的值必须是constant_pool表的有效索引。该索引处的constant_pool条目必须是一个CONSTANT_Utf8_info结构(第4.4.7节),表示以内部形式编码的有效二进制类或接口名称(第4.2.1节)。
[...]*
因此,您不需要单独发送类文件旁边的类的名称。 如果这与类加载有关,请注意ClassLoader接受二进制名称,然后尝试加载相应的类,而不是相反。除非你使用反射,否则这个名字是自动给类装入器的;你不需要提前知道否则,如果您只是试图从类文件中获取二进制名称,那么您可以研究上面链接的规范来手动解析类文件。但是使用现有的库可能要容易得多,比如 ASM、Javassist、Byte Buddy 等等。有了JEP 457: Class-File API (Preview),Java本身最终可能会提供一个标准的API。
1条答案
按热度按时间e5nqia271#
二进制名称存储在类文件中。从§4.1 Java Virtual Machine Specification(JVMS)的
ClassFile
结构中,可以看到以下内容:this_class
this_class
项的值必须是constant_pool
表的有效索引。该索引处的constant_pool
条目必须是一个CONSTANT_Class_info
结构(第4.4.1节),表示这个class
文件定义的类或接口。以及§4.4.1 JVMS的
CONSTANT_Class_info
结构:CONSTANT_Class_info
结构用于表示类或接口:CONSTANT_Class_info
结构的项目如下:tag
标记项的值为
CONSTANT_Class
(7)。name_index
name_index
项的值必须是constant_pool
表的有效索引。该索引处的constant_pool
条目必须是一个CONSTANT_Utf8_info
结构(第4.4.7节),表示以内部形式编码的有效二进制类或接口名称(第4.2.1节)。因此,您不需要单独发送类文件旁边的类的名称。
如果这与类加载有关,请注意
ClassLoader
接受二进制名称,然后尝试加载相应的类,而不是相反。除非你使用反射,否则这个名字是自动给类装入器的;你不需要提前知道否则,如果您只是试图从类文件中获取二进制名称,那么您可以研究上面链接的规范来手动解析类文件。但是使用现有的库可能要容易得多,比如 ASM、Javassist、Byte Buddy 等等。有了JEP 457: Class-File API (Preview),Java本身最终可能会提供一个标准的API。