Cette question est traitée JLS §13.1., The Form of a Binary:
Les programmes doivent être compilés soit dans le format de fichier class
spécifié par La spécification Java Virtual Machine, Java SE 8 Édition, ou dans une représentation qui peut être mappé dans ce format par un chargeur de classe écrit dans le langage de programmation Java.
Donc, vous n'êtes pas tenu de livrer le code compilé comme .class
fichiers du tout, tant que vous avez une implémentation de chargeur de classe capable de charger votre représentation de code. Notez qu'à ce niveau, par ex. lors du passage des données mappées à ClassLoader.defineClass
, le nom de fichier du fichier de classe n'est pas du tout présent. Les deux spécifications, JLS et JVM, utilisent systématiquement le terme "class file" synonyme de "une séquence d'octets dans le format de fichier de classe" plutôt que "une entrée dans un système de fichiers ou une archive zip". tout.
C'est assortissent également la direction Java 9 va, pour fournir des bibliothèques de classes est une coutume, le format de bibliothèque potentiellement optimisé plutôt que d'un conteneur zip complet de .class
fichiers.
Cependant, il serait très déconseillé de nommer les fichiers contenant une représentation différente avec une fin .class
.
Votre affirmation citée est un peu étrange. Il commence par
Donner .class
fichiers le même nom que la classe publique qu'ils contiennent est tout simplement un must, ...
mais un fichier .class
ne doit pas contenir du tout une classe public
. Dans sa forme actuelle, il contient au plus une classe qui ne doit pas être public
. Mais il peut aussi contenir une classe fictive pour fournir des méta-informations package
ou, à partir de Java 9, une spécification de module.
De même, afin d'être trouvées par des règles de recherche par défaut, par ex. En utilisant URLClassLoader
, vous ne donnez pas au fichier .class
le nom de la classe contenue, mais utilisez plutôt son nom court et placez-le dans une structure/chemin de répertoire dérivé du composant package de son nom qualifié.
Mais la deuxième partie
... mais selon la JLS c'est pas stricte. Du point de vue de JLS, il est laissé au compilateur de choisir ou non de définir une telle restriction.
est correct. Comme expliqué ci-dessus, il n'y a même pas d'obligation de livrer des fichiers de classe. Comparer à
JLS §1., Introduction:
Le langage de programmation Java est normalement compilé à l'instruction de bytecode et définir un format binaire défini dans La spécification de la machine virtuelle Java, Java SE 8 Édition.
Notez le mot « normalement »
et
JVMS §2.1., The class File Format:
Code Compilé à exécuter par la machine virtuelle Java est représentée à l'aide d'un système d'exploitation et Matériel- format binaire indépendant, généralement (mais pas nécessairement) stocké dans un fichier, connu sous le format de fichier class
.
« généralement (mais pas nécessairement) » ...
j'utiliser un numéro de chapitre ou de la page pour accéder plus à ce sujet dans les publications/écrits. – Salvioner
Notez qu'il peut y avoir plusieurs fichiers .class par source .java, c'est-à-dire un pour chaque classe interne créée. Ceux-ci ont normalement le format [classe_public_de_classe] $ [classe_classe] .class' pour les classes internes nommées ou la classe [toplevel_public_class] $ [nombre] .class' pour les classes internes anonymes. Je ne sais pas si c'est une règle ou juste une manière standard de le faire mais c'est un exemple que les fichiers .class ne correspondent pas toujours exactement au nom de la classe supérieure (bien que ce soit une partie importante du nom). – Thomas
Btw, je peux me tromper ici mais du point de vue de l'exécution les noms de fichiers ne devraient pas importer du tout puisque les fichiers contiennent toutes les informations nécessaires. Cependant, avoir des noms de fichiers correspondants facilite les opérations humaines ou textuelles (par exemple, essayer de trouver une classe dans un pot pour la charger) puisque vous n'avez pas besoin d'analyser chaque fichier pour trouver le bon. La restriction sur les fichiers source est probablement aussi principalement destinée à empêcher les humains de tout gâcher;) – Thomas