为类生成多个.class文件?

出于好奇,为什么有时在编译后为类生成多个Java .class文件? 例如,我的应用程序有六个类。 对于一个类,总共生成了10个.class文件,从MyClass#1开始到MyClass#10。

这些是针对内部类和静态嵌套类的 。 带数字的是匿名内部类。

例如:

class Foo { class Bar { } static class Baz { } void run() { Helper t = new Helper() { int helpMethod() { return 2; } }; } } 

这将生成类文件Foo.classFoo$Bar.classFoo$Baz.classFoo$1.class (用于实现Helper接口)

如果,您可以从单个源文件中获得更多.class文件

  • 该类包含内部类或静态内部类。 内部类可以嵌套。 它们的名称是$

  • 内部接口始终是静态的。

  • 匿名内部类(实际上是没有名称的普通内部类)

  • 主类之前和之后的包访问接口和类。 您可以在单个Java源文件中拥有任意数量的包访问类和接口。 通常只有类使用的小辅助对象才会被放入同一个文件中。

如果您的类包含内部类,则一个java源文件可以生成多个类文件。 匿名内部类由编号的类文件表示。

java中的每个类都属于.java文件,但.java文件可以包含多个类。 这包括内部和匿名类。 为内部类生成的.class文件在其名称中包含“$”。 匿名内部类获取数字。

要添加上面的答案,这是基于Comparators生成的内部类的另一个很好的例子 (每个Comparator在不同的MyClass $ X.class中编译):

 public class MyClass { ... public void doSomething() { ... Collections.sort(list, new Comparator() { public int compare(MyObj o1, MyObj o2) { ... } }); ... } ... } 

如果有一个X.java文件,如果它包含4个collections.sort(){},那么在编译X.class,X $ 1.class,X $ 2.class,X $ 3.class,X $ 4.class之后将生成。

在内部类和静态内部类的情况下,生成更多.class文件。

只有当您的类具有内部类时,才会在编译时生成多个类。

参考: 为什么带有内部类的Java代码会生成第三个SomeClass $ 1.class文件?