2010-07-02 77 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

相關問題