クラスに対して複数の.classファイルが生成されましたか?

StackOverflow https://stackoverflow.com/questions/1031962

  •  06-07-2019
  •  | 
  •  

質問

好奇心から、コンパイル後にクラスに対して複数のJava .classファイルが生成されることがあるのはなぜですか?たとえば、私のアプリケーションには6つのクラスがあります。 1つのクラスについて、MyClass#1からMyClass#10までの合計10個の.classファイルが生成されました。

役に立ちましたか?

解決

これらは、内部クラスおよび静的にネストされたクラス。数字のあるものは匿名の内部クラスです。

例:


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

これにより、クラスファイルFoo.classFoo$Bar.classFoo$Baz.class、およびFoo$1.classが生成されます(Helperインターフェイスの実装用)

他のヒント

次の場合、単一のソースファイルからより多くの.class filsを取得します

  • クラスには、内部クラスまたは静的内部クラスが含まれます。内部クラスはネストできます。名前は<outer class name>$<inner class name>です。

  • 常に静的な内部インターフェイス。

  • 匿名内部クラス(実際には名前のないプレーンな内部クラス)

  • メインクラスの前後のパッケージアクセスインターフェイスとクラス。 1つのJavaソースファイルに任意の数のパッケージアクセスクラスとインターフェイスを含めることができます。通常、クラスでのみ使用される小さなヘルパーオブジェクトは、同じファイルに配置されます。

クラスに内部クラスが含まれている場合、1つのJavaソースファイルで複数のクラスファイルを生成できます。匿名の内部クラスは、番号付きのクラスファイルで表されます。

javaのすべてのクラスは.javaファイルに属しますが、.javaファイルには複数のクラスを含めることができます。これには、内部クラスと匿名クラスが含まれます。内部クラス用に生成された.classファイルには、名前に「$」が含まれています。匿名の内部クラスは番号を取得します。

上記の答えに追加するために、これはコンパレータに基づいて生成された内部クラスの別の良い例です(各コンパレータは異なる MyClass $ X.class ):

public class MyClass {
    ...

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

    ...
}

1つのX.javaファイルがあり、4つのcollections.sort(){}が含まれている場合、コンパイル後にX.class、X $ 1.class、X $ 2.class、X $ 3.class、X $ 4.classは生成されます。

内部クラスおよび静的内部クラスの場合、より多くの.classファイルが生成されます。

コンパイル時に複数のクラスが生成されます。クラスに内部クラスがある場合のみ。

参照: 内部クラスを持つJavaコードが3番目のSomeClass $ 1.classファイルを生成する理由

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top