2010-07-02 49 views
1

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

回答

0

通常类名是在.class之前的,所以ClassName.class是约定。

+0

如果开发人员在文件中有多个类别,则这没有帮助。 – duffymo 2010-07-02 15:57:17

+1

我的印象是编译器会从单个.java文件创建多个.class文件,如果是这种情况。 – plor 2010-07-02 16:25:12

1

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

javap -public -classpath . FileName 

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

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

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

cp_info { 
u1 tag; 
u1 info[]; 

}

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

。这可能与文件的名称有关。

+0

+1对于这个详细而正确的答案,您值得的不仅仅是一两个upvotes。干得好! – PeterK 2011-03-16 16:11:45

相关问题