gpt4 book ai didi

java - 查找类(class)名称

转载 作者:行者123 更新时间:2023-11-29 04:01:35 25 4
gpt4 key购买 nike

我想知道“如何从 .class 文件中查找类名”。我希望你能尽可能清楚地解释这一点,因为我只了解 java 的基础知识。

最佳答案

Java 类文件是一种遵循specified format 的数据结构。 .

ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}

常量池数据条目遵循以下一般specified format其中标签决定了信息的长度。

cp_info {
u1 tag;
u1 info[];

除非 tag=CONSTANT_Utf8 然后是以下 specified format紧随其后。

    CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
  1. 读取 constant_pool_count - 它在结构中的固定位置。 constant_pool_count = 常量池的大小+1。因为常量池不是一个固定大小的结构,所以需要知道constant_pool_count才能读取结构的其余部分。
  2. 通读常量池。常量池的开头在一个固定的位置。读取第 i 个条目的标签。如果tag==CONSTANT_Utf8_info,则需要读取长度,否则可以单独通过tag来确定entry的长度。不管你知道第 i+1 个条目的起始位置。重复此过程,直到完成常量池。记录所有常量池条目的起始位置。
  3. 现在您知道 this_class 的位置了。它相对于常量池的末端是固定的。它是常量池的索引。
  4. 由于您记录了所有常量池条目的起始位置,因此您可以查找它。你应该发现标签==Constant_ClassInfo 和它的信息也是常量池的索引。
  5. 查一下。你应该会发现标签==Constant_Utf8_info。与此条目关联的信息是在 internal form 中编码的完全限定类名. “java/lang/Thread”而不是“java.lang.Thread”。

.这可能与文件名有关。

关于java - 查找类(class)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com