2012-07-09 127 views
52

我一直在使用Eclipse作爲我的開發IDE。我也用它將我的應用程序導出到.jar文件中。當我查看.jar​​文件中的類時,我的一些類包含該類的名稱,美元符號,然後是數字。例如:java編譯的類包含美元符號

  • 查找$ 1.class
  • 查找$ 2.class
  • 查找$ 3.class
  • Find.class

我發現它這樣做的更大類。這是因爲類變得如此之大,它將它編譯成多個類?我搜索了多個論壇,並搜索了Java文檔,但還沒有發現任何與之相關的內容。有人可以解釋嗎?

回答

69

內部類將被編譯,類文件將爲ClassName$InnerClassName。在Anonymous內部類的情況下,它將顯示爲數字。類(Java代碼)的大小不會導致生成多個類。

E.g.給定這一段代碼:這將產生

public class TestInnerOuterClass { 
    class TestInnerChild{ 

    } 

    Serializable annoymousTest = new Serializable() { 
    }; 
} 

類將是:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

更新:

使用匿名類不被認爲是一種不好的做法,它僅取決於使用情況。

檢查this討論,讓

+0

好吧,有一個匿名課程是不好的?我不太明白它是如何工作的。如果我在一個類中創建了一個新的類實例變量,那是一個匿名類? – Frizinator 2012-07-09 03:48:16

+0

不,它有一個匿名類,這取決於用法。更新我的文章 – mprabhat 2012-07-09 03:49:30

+4

包含類體的枚舉將自動生成一個匿名內部類,它擴展了enum類,從而生成另一個帶有$的類文件。 – dlaidlaw 2015-07-07 15:22:17

0

爲了回答您的評論的都是匿名類壞。他們絕對不是。 認爲這一個動作監聽分配給一個JButton:

JButton button = new JButton(...); 
button.addActionListener(new ActionListener() { ... }); 

或本由「名稱」屬性做一個區分大小寫的排序

Collections.sort(array, new Comparator<Foo>() { 
    public int compare(Foo f1, Foo f2) { 
     return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); 
    } 
}); 

您還可以看到很多的Runnable和可作爲匿名課程完成。

5

除了由@mprabhat提出的上述情況,其他情況下可能是:

  1. ,如果你的類包含一個單獨的類將針對可能會產生過一個枚舉變量。生成的.class的名稱將爲ClassName $ Name_of_enum
  2. 如果你的類X被繼承,即延伸的另一類Ÿ,則會有一個名爲類名$ 1.class類名生成一個.class $ 1 $ 1.class
  3. 如果你的類X被實現接口ÿ,那麼就不會有名爲類名$ 1.class的ClassName $ 1 $ 1.class產生一個.class。

這些情況是我對jar中的.class文件的檢查的派生。

+0

我有一個不符合這些標準的類,並且class.getName()仍然是錯誤的 - 對於Group.java,它返回Group _ $$ _ jvst248_20。我不知道發生了什麼事。絕對沒有枚舉,擴展或實現。 – Amalgovinus 2016-04-20 20:12:59