web-dev-qa-db-fra.com

java les classes compilées contiennent des signes dollar

J'utilise Eclipse comme IDE de développement. Je l'utilise également pour exporter mon application dans un fichier .jar. Lorsque je regarde mes classes dans le fichier .jar, certaines de mes classes contiennent le nom de cette classe, un signe dollar, puis un nombre. Exemple:

  • Trouver 1 classe
  • Trouver 2 $ de classe
  • Trouver une classe de 3 $
  • Find.class

J'ai remarqué qu'il le fait sur des classes plus importantes. Est-ce parce que les classes deviennent si grandes qu'elles le compilent en plusieurs classes? J'ai cherché sur google et consulté plusieurs forums, et j'ai cherché dans la documentation Java mais je n'ai rien trouvé de similaire). Quelqu'un pourrait-il expliquer?

74
Frizinator

Les classes internes, le cas échéant présentes dans votre classe, seront compilées et le fichier de classe sera ClassName$InnerClassName. Dans le cas des classes internes anonymes, elles apparaîtront sous forme de nombres. La taille de la classe (code Java) ne conduit pas à la génération de plusieurs classes.

Par exemple. étant donné ce morceau de code:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

Les classes qui seront générées seront:

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

Mise à jour:

L'utilisation d'une classe anonyme n'est pas considérée comme une mauvaise pratique, elle dépend simplement de l'utilisation.

Vérifiez ceci discussion sur SO

96
mprabhat

C'est parce que vous avez des classes anonymes dans cette classe plus grande. Ils sont compilés à l'aide de cette convention de dénomination.

Voir L'énigme de la classe anonyme

15
jjathman

En plus des cas ci-dessus présentés par @mprabhat, les autres cas pourraient être:

  1. si votre classe contient une variable enum, une classe distincte sera également générée pour cela. Le nom de la classe générée serait ClassName $ Name_of_enum.
  2. Si votre classe X hérite, c'est-à-dire étendant une autre classe Y , alors il y aurait une .class générée avec le nom ClassName $ 1.class ou ClassName $ 1 $ 1.class
  3. Si votre classe X implémente une interface Y , alors il y aurait un. classe générée avec le nom ClassName $ 1.class ou ClassName $ 1 $ 1.class.

Ces cas sont des dérivations de mon inspection sur les fichiers .class en pot.

7
Subramanya

Pour répondre à votre commentaire, les classes anonymes sont mauvaises. Ils ne le sont certainement pas. Considérez ceci pour affecter un écouteur d'action à un JButton:

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

ou ceci pour faire un tri insensible à la casse par la propriété "name"

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

Vous verrez également beaucoup de Runnable et Callable faites comme des classes anonymes.

0
Matt