java编译的类包含美元符号


80

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

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

我注意到它是在较大的班级上这样做的。这是因为类太大了,将其编译成多个类吗?我在Google上搜索并浏览了多个论坛,并搜索了Java文档,但没有找到任何相关的内容。有人可以解释吗?


测试此问题的示例代码github.com/Aksi0m/SampleFor123686419
Prags

根据Google团队issuetracker.google.com/issues/123736741的回复,此问题已在内部修复,并将在下一版的Navigation中可用。
Prags

Answers:


109

内部类(如果您的类中存在)​​将被编译,并且类文件将为ClassName$InnerClassName。如果是匿名内部类,它将显示为数字。类的大小(Java代码)不会导致生成多个类。

例如,给出这段代码:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

将生成的类为:

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

更新:

使用匿名类并不被认为是一种坏习惯,它仅取决于用法。

检查对SO讨论


1
好吧,拥有一个匿名班不好吗?我不太了解它是如何工作的。如果我在一个类中创建一个类的新实例变量,那是一个匿名类?
弗里奇纳特

不,拥有匿名类也不错,这取决于用法。更新了我的帖子
mprabhat 2012年

4
包含类主体的枚举将自动生成一个匿名内部类,该内部类扩展了enum类,从而生成另一个带有$的类文件。
dlaidlaw

1
同样,如果内部类是私有的,则会生成一个名为OuterClass $ 1.class的附加类
SandeepGodara

@mprabhat:android studio中有什么机制可以查看这些类的层次结构或列表吗?
user1090751


9

除了@mprabhat提出的上述情况外,其他情况还可能是:

  1. 如果您的类包含一个枚举变量,那么也会为此生成一个单独的类。生成的.class的名称为ClassName $ Name_of_enum
  2. 如果您的类X是继承的,即扩展了另一个类Y,则将生成一个名为className $ 1.classClassName $ 1 $ 1.class的.class。
  3. 如果您的类X正在实现接口Y,则将生成一个名为className $ 1.classClassName $ 1 $ 1.class的.class

这些情况是我对jar中的.class文件进行检查得出的。


我有一个不满足这些条件的类,并且class.getName()仍然是错误的-对于Group.java,它返回Group _ $$ _ jvst248_20。我不知道发生了什么事。绝对没有枚举,扩展或实现。
Amalgovinus '16

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和Callable作为匿名类完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.