java编译的类包含美元符号
我一直在使用Eclipse作为我的开发IDE。 我也用它将我的应用程序导出到.jar文件中。 当我在.jar文件中查看我的类时,我的一些类包含该类的名称,一个美元符号,然后是一个数字。 例:
- 查找$ 1.class
- 查找$ 2.class
- 查找$ 3.class
- Find.class
我已经注意到它在更大的class上这样做。 这是因为类变得如此之大,它编译成多个类? 我search了多个论坛,并search了Java文档,但还没有发现任何与之相关的内容。 有人可以解释吗?
如果您的类中存在任何内部类,它们将被编译,并且类文件将是ClassName$InnerClassName
,并将匿名内部类作为数字显示,Class(Java Code)的大小不会导致生成多个类。
例如给定这段代码:
public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; }
将生成的类将是:
- TestInnerOuterClass.class
- TestInnerOuterClass $ TestInnerChild.class
- TestInnerOuterCasss $ 1.class
更新:
使用匿名类不被认为是一个坏习惯,它只是取决于用法。
查看关于SO的讨论
这是因为你在这个大类中有匿名类。 他们使用这个命名约定进行编译。
见无名氏难题
除了@mprabhat提供的上述情况之外,其他情况可能是:
- 如果你的类包含一个枚举variables,那么也会为此生成一个单独的类。 生成的.class的名称将是ClassName $ Name_of_enum 。
- 如果您的类X正在inheritance,即扩展另一个类Y ,那么会生成一个名为ClassName $ 1.class或ClassName $ 1 $ 1.class的.class
- 如果你的类X正在实现一个接口Y ,那么将会有一个名为ClassName $ 1.class或者ClassName $ 1 $ 1.class的.class类 。
这些情况是我对jar中的.class文件的检查的派生。
要回答你的评论是匿名类错误。 他们绝对不是。 考虑这个分配一个动作监听器到JButton:
JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... });
或者用“name”属性来区分大小写
Collections.sort( array, new Comparator<Foo>() { public int compare(Foo f1, Foo f2) { return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); } });
你也会看到很多Runnable和Callable都是匿名类。