我想知道“如何从.class文件中找到类名”。我希望你能尽可能清楚地解释这一点,因为我只知道关于java的基础知识。寻找类名称
Q
寻找类名称
1
A
回答
0
通常类名是在.class之前的,所以ClassName.class是约定。
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];
}
- 读constant_pool_count - 这是在结构的固定位置。 constant_pool_count =常量池的大小+1。因为常量池不是固定大小的结构,所以有必要知道constant_pool_count来读取结构的其余部分。
- 通读常量池。常量池的开始处于固定位置。阅读第i条目的标签。如果标记== CONSTANT_Utf8_info,则需要读取长度,否则可以通过标记单独确定条目的长度。无论您知道第i + 1条目的起始位置。重复此过程直到完成常量池。记录所有常量池条目的起始位置。
- 现在你知道this_class的位置。它相对于常量池的末尾是固定的。它是常数池的索引。
- 由于您记录了所有常量池条目的起始位置,因此您可以查看它。您应该发现标记== Constant_ClassInfo及其信息也是常量池的索引。
- 查看。你应该找到标签== Constant_Utf8_info。与此条目相关的信息是编码为internal form的完全限定类名。 “java/lang/Thread”而不是“java.lang.Thread”。
。这可能与文件的名称有关。
+0
+1对于这个详细而正确的答案,您值得的不仅仅是一两个upvotes。干得好! – PeterK 2011-03-16 16:11:45
相关问题
- 1. mysqli - 按名称排序我在寻找
- 2. 无不是寻找实体名称 'GroupMessageInfo'
- 3. 寻找搜索算法名称
- 4. Python的硒寻找元素的名称
- 5. 查找Jar名称使用类名称
- 6. 优化Soundex寻找类似名称的查询
- 7. 寻找带有类名称示例的列表
- 8. 在类中查找名称
- 9. 寻找NSMutableDate类
- 10. ElasticSearch - 寻找人名
- 11. Randoop:找不到类型名称的类“”
- 12. 类型或命名空间名称“名称”找不到
- 13. 寻找类似笨
- 14. 寻找类似“array_and”
- 15. 无效名称(类型名称1,类型名称2,类型名称3 [名称1] [名称2]);
- 16. 无法找到类型或名称空间名称'Skeleton'
- 17. 错误:无法找到类型或名称空间名称'ExcelPackage'
- 18. 无法找到类型或名称空间名称'IConvertible'
- 19. 无法找到类型或名称空间名称'xxx'
- 20. 无法找到类型或名称空间名称'IAuthorizationState'
- 21. 无法找到类型或名称空间名称'Startup'
- 22. 无法找到类型或名称空间名称'DevExpress' - 错误
- 23. 无法找到类型或名称空间名称GridViewHelper
- 24. 无法找到类型或名称空间名称'dynamic'
- 25. 编译错误找不到类型或名称空间名称
- 26. CS0246:无法找到类型或名称空间名称'itextsharp'
- 27. 错误CS0246:找不到类型或名称空间名称`HtmlAgilityPack'
- 28. 无法找到类型或名称空间名称'readFullyStream'
- 29. 无法找到类型或名称空间名称'System'
- 30. 无法找到类型或名称空间名称'BasePage'
如果开发人员在文件中有多个类别,则这没有帮助。 – duffymo 2010-07-02 15:57:17
我的印象是编译器会从单个.java文件创建多个.class文件,如果是这种情况。 – plor 2010-07-02 16:25:12