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() {
};
}
类将是:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
更新:
使用匿名类不被认为是一种不好的做法,它仅取决于使用情况。
检查this讨论,让
为了回答您的评论的都是匿名类坏。他们绝对不是。 认为这一个动作监听分配给一个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提出的上述情况,其他情况下可能是:
- ,如果你的类包含一个单独的类将针对可能会产生过一个枚举变量。生成的.class的名称将为ClassName $ Name_of_enum。
- 如果你的类X被继承,即延伸的另一类Ÿ,则会有一个名为类名$ 1.class或类名生成一个.class $ 1 $ 1.class
- 如果你的类X被实现接口ÿ,那么就不会有名为类名$ 1.class或的ClassName $ 1 $ 1.class产生一个.class。
这些情况是我对jar中的.class文件的检查的派生。
我有一个不符合这些标准的类,并且class.getName()仍然是错误的 - 对于Group.java,它返回Group _ $$ _ jvst248_20。我不知道发生了什么事。绝对没有枚举,扩展或实现。 – Amalgovinus 2016-04-20 20:12:59
好吧,有一个匿名课程是不好的?我不太明白它是如何工作的。如果我在一个类中创建了一个新的类实例变量,那是一个匿名类? – Frizinator 2012-07-09 03:48:16
不,它有一个匿名类,这取决于用法。更新我的文章 – mprabhat 2012-07-09 03:49:30
包含类体的枚举将自动生成一个匿名内部类,它扩展了enum类,从而生成另一个带有$的类文件。 – dlaidlaw 2015-07-07 15:22:17