我想知道「如何從.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