2012-07-09 10 views
52

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

  • は$ 1.class
  • は$ 2.class
  • が、私はそれがより大きなクラスでこれを行い気づいた

Find.class $ 3.class

  • を探す検索します。これはクラスが非常に大きくなり、複数のクラスにコンパイルされるためですか?私はグーグルで、複数のフォーラムを見て、Javaドキュメンテーションを検索しましたが、それに関連するものは見つけられませんでした。誰かが説明できますか?

  • 答えて

    69

    クラス内のクラスが存在する場合は、内部クラスがコンパイルされ、クラスファイルはClassName$InnerClassNameになります。匿名の内部クラスの場合は、数字として表示されます。クラス(Javaコード)のサイズは複数のクラスの生成につながりません。

    など。

    public class TestInnerOuterClass { 
        class TestInnerChild{ 
    
        } 
    
        Serializable annoymousTest = new Serializable() { 
        }; 
    } 
    

    生成されるクラスであろう:コードのこの部分所与

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

    を更新:

    匿名クラスの使用は悪い習慣とはみなされません。使用方法によって異なります。あなたはこの大きなクラス内の匿名クラスを持っているので、

    チェックのthis議論は、SO

    +0

    匿名のクラスを持つのは悪いですか?私はそれがどのように機能するのかよく分かりません。クラスの新しいインスタンス変数をクラスに作成すると、それは匿名クラスですか? – Frizinator

    +0

    いいえ、匿名のクラスを持つことは悪くない、それは使用法によって異なります。私の投稿を更新しました – mprabhat

    +4

    クラス本体を含む列挙型は、列挙型クラスを拡張する匿名の内部クラスを自動的に生成し、それで$を持つ別のクラスファイルを生成します。 – dlaidlaw

    0

    を参照してください、匿名クラスが悪いです。彼らは確かにそうではありません。 JButtonのにアクションリスナーを割り当てるには、これを 考えてみましょう:

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

    または、この「名前」プロパティ

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

    で大文字小文字を区別しないソートを行うためにあなたはまた、Runnableを多くのを見ることができますし、匿名クラスとして呼び出すことができます。

    5

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

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

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

    +0

    私はこれらの基準のどれにも合致しないクラスを持っており、class.getName()はまだ間違っています - Group.javaの場合、Group _ $$ _ jvst248_20を返します。私は何が起こっているのか分かりません。間違いなく列挙型、拡張、実装。 – Amalgovinus

    関連する問題