java编译的类包含美元符号

问题描述:

我一直在使用Eclipse作为我的开发IDE。我也用它将我的应用程序导出到.jar文件中。当我查看.jar​​文件中的类时,我的一些类包含该类的名称,美元符号,然后是数字。例如:java编译的类包含美元符号

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

我发现它这样做的更大类。这是因为类变得如此之大,它将它编译成多个类?我搜索了多个论坛,并搜索了Java文档,但还没有发现任何与之相关的内容。有人可以解释吗?

内部类将被编译,类文件将为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

这是因为你有这样大的类中的匿名类。他们使用这个命名约定进行编译。

The Anonymous Class Conundrum

为了回答您的评论的都是匿名类坏。他们绝对不是。 认为这一个动作监听分配给一个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和可作为匿名课程完成。

除了由@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