java 是否有可能仅从类的原始字节中获得类的二进制名称?

mmvthczy  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(110)

假设我有一个类文件,比如Foo.classFoo$Bar.class,它是从下面的java源文件编译而来的:

  1. package com.foo.bar;
  2. public class Foo {
  3. class Bar {
  4. }
  5. }

是否可以分析类中的字节,并确定类的二进制名称应该是com.foo.bar.Foo

我通过网络发送类,我试图确定字节是否足够,或者我还需要以某种方式预先确定并发送二进制名称。

e5nqia27

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结构用于表示类或接口:

  1. CONSTANT_Class_info {
  2. u1 tag;
  3. u2 name_index;
  4. }

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接受二进制名称,然后尝试加载相应的类,而不是相反。除非你使用反射,否则这个名字是自动给类装入器的;你不需要提前知道否则,如果您只是试图从类文件中获取二进制名称,那么您可以研究上面链接的规范来手动解析类文件。但是使用现有的库可能要容易得多,比如 ASMJavassistByte Buddy 等等。有了JEP 457: Class-File API (Preview),Java本身最终可能会提供一个标准的API。

展开查看全部

相关问题