クラスに対して複数の.classファイルが生成されましたか?
質問
好奇心から、コンパイル後にクラスに対して複数の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.class
、Foo$Bar.class
、Foo$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ファイルが生成されます。
コンパイル時に複数のクラスが生成されます。クラスに内部クラスがある場合のみ。