java编译的类包含美元符号

Fri*_*tor 75 java compilation class

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

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

我注意到它在更大的课程上做到这一点.这是因为这些类变得如此之大,它会将它编译成多个类吗?我用Google搜索并查看了多个论坛,并搜索了Java文档,但没有发现任何与之相关的内容.有人能解释一下吗

mpr*_*hat 98

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

例如,给出这段代码:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}
Run Code Online (Sandbox Code Playgroud)

将生成的类将是:

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

更新:

使用匿名类不被认为是一种不好的做法,它只取决于使用情况.

在SO上查看讨论

  • 包含类主体的枚举将自动生成一个扩展枚举类的匿名内部类,从而生成另一个带有$的类文件. (4认同)

jja*_*man 15

这是因为你在这个更大的类中有匿名类.它们使用此命名约定进行编译.

请参阅匿名类难题


Sub*_*nya 7

除了@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文件的推导.