Javaコンパイル済みクラスにはドル記号が含まれています


83

私は開発IDEとしてEclipseを使用しています。また、アプリケーションを.jarファイルにエクスポートするためにも使用します。.jarファイルでクラスを見ると、いくつかのクラスには、そのクラスの名前、ドル記号、数字が含まれています。例:

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

私はそれがより大きなクラスでこれを行うことに気づきました。これは、クラスが非常に大きくなり、複数のクラスにコンパイルされるためですか?私はグーグルで複数のフォーラムを調べ、Javaドキュメントを検索しましたが、それに関連するものは何も見つかりませんでした。誰かが説明できますか?


サンプルコードは、この問題をテストするgithub.com/Aksi0m/SampleFor123686419
ブラーイエス

google team issuetracker.google.com/issues/123736741からの回答によると、これは内部で修正されており、Navigationの次のリリースで利用できるようになります。
ブラーイエス

回答:


111

クラスに内部クラスが存在する場合は、コンパイルされ、クラスファイルはになります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
さて、匿名のクラスを持つのは悪いことですか?私はそれがどのように機能するのかよくわかりません。クラス内のクラスの新しいインスタンス変数を作成する場合、それは匿名クラスですか?
Frizinator 2012

いいえ、匿名クラスを持つことは悪くありません、それは使用法に依存します。私の投稿を更新しました
mprabhat 2012

4
クラス本体を含む列挙型は、列挙型クラスを拡張する匿名の内部クラスを自動的に生成するため、$を含む別のクラスファイルが生成されます。
dlaidlaw 2015

1
また、内部クラスがプライベートの場合、OuterClass $ 1.classという名前の追加クラスが1つ生成されます
SandeepGodara 2016

@mprabhat:これらのクラスの階層またはリストを表示するメカニズムはAndroid Studioにありますか?
user1090751 2018年

15

これは、この大きなクラス内に匿名クラスがあるためです。これらは、この命名規則を使用してコンパイルされます。

匿名クラスの難問を参照してください


9

@mprabhatによって提示された上記のケースに加えて、他のケースは次のようになります。

  1. クラスに列挙型変数が含まれている場合は、そのために別のクラスも生成されます。生成される.classの名前は、ClassName $ Name_of_enumになります。
  2. クラスXが継承している、つまり別のクラスYを拡張している場合、ClassName $ 1.classまたはClassName $ 1 $ 1.classという名前で生成された.classがあります。
  3. クラスXがインターフェースYを実装している場合、ClassName $ 1.classまたはClassName $ 1 $ 1.classという名前で生成された.classがあります。

これらのケースは、jar内の.classファイルに対する私の検査の派生物です。


これらの基準のいずれも満たさないクラスがありますが、class.getName()はまだ間違っています-Group.javaの場合、Group _ $$ _jvst248_20を返します。何が起こっているのかわかりません。列挙型、拡張型、実装型は絶対にありません。
Amalgovinus 2016

0

あなたのコメントに答えるのは匿名クラスが悪いです。彼らは間違いなくそうではありません。アクションリスナーをJButtonに割り当てるには、次のことを考慮してください。

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

または、「name」プロパティで大文字と小文字を区別しない並べ替えを行う場合

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

また、匿名クラスとして実行されるRunnableとCallableの多くが表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.