Question

Par curiosité, pourquoi parfois plusieurs fichiers .class Java sont-ils générés pour une classe après la compilation? Par exemple, mon application a six classes. Au total, 10 fichiers .class ont été générés pour une classe, de MyClass # 1 à MyClass # 10.

Était-ce utile?

La solution

Il s’agit des classes internes et classes imbriquées statiques . Ceux avec des nombres sont des classes internes anonymes.

Par exemple:


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

Ceci produira des fichiers de classe Foo.class, Foo$Bar.class, Foo$Baz.class et Foo$1.class (pour l'implémentation de l'interface Helper)

.

Autres conseils

Vous obtenez plus de fichiers .class d'un seul fichier source si

  • la classe contient des classes internes ou des classes internes statiques. Les classes intérieures peuvent s'emboîter. Leurs noms sont <outer class name>$<inner class name>.

  • interfaces internes toujours statiques.

  • classes internes anonymes (qui sont en fait des classes internes simples sans nom)

  • package interfaces et classes d'accès avant et après votre classe principale. Vous pouvez avoir un nombre arbitraire de classes d'accès au package et d'interfaces dans un seul fichier source Java. D'habitude, les petits objets d'assistance utilisés uniquement par la classe sont simplement placés dans le même fichier.

Un fichier source Java peut générer plusieurs fichiers de classe si votre classe contient des classes internes. Les classes internes anonymes sont représentées par vos fichiers de classe numérotés.

Chaque classe java appartient à un fichier .java, mais un fichier .java peut contenir plusieurs classes. Cela inclut les classes internes et anonymes. Les fichiers .class générés pour les classes internes contiennent un '$' dans leur nom. Les classes internes anonymes reçoivent des nombres.

Pour ajouter aux réponses ci-dessus, il s'agit d'un autre bon exemple de classes internes générées basées sur des comparateurs (chaque comparateur est compilé dans un MyClass $ X.class ):

public class MyClass {
    ...

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

    ...
}

S'il existe un fichier X.java et s'il contient 4 collections.sort () {}, après la compilation X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class être généré.

En cas de classe interne et de classe interne statique, davantage de fichiers .class sont générés.

Plus d'une classe sera générée lors de la compilation, uniquement si votre classe a une classe interne.

se référer: Pourquoi le code Java avec une classe interne génère-t-il un troisième fichier SomeClass $ 1.class?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top