找到类名

时间:2010-07-02 15:46:46

标签: java

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

3 个答案:

答案 0 :(得分:3)

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,其中tag确定信息的长度。

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,则需要读取长度,否则您可以单独通过标记确定条目的长度。无论你知道第i + 1条的起始位置。重复此过程,直到完成常量池。记录所有常量池条目的起始位置。
  3. 现在您知道this_class的位置了。它相对于常量池的末尾是固定的。它是常量池的索引。
  4. 由于您记录了所有常量池条目的起始位置,因此您可以查找它。您应该发现标记== Constant_ClassInfo及其信息也是常量池的索引。
  5. 查一查。您应该找到标签== Constant_Utf8_info。与此条目关联的信息是internal form中编码的完全限定类名。 “java / lang / Thread”而不是“java.lang.Thread”。
  6. 。这可能与文件名有关。

答案 1 :(得分:1)

类名通常(但不总是)是文件的名称。尝试使用以下命令:

javap -public -classpath . FileName

其中“filename”不包含“.class”后缀。

javap 是Java类文件反汇编程序,-public开关将显示公共类和成员。在Java中,类路径是Java运行时将查找类文件的目录。替换“。”对于您感兴趣的文件目录,如果它不在您当前的目录中。

答案 2 :(得分:0)

通常类名是.class之前的名称,因此ClassName.class是约定。