2017-10-18 38 views
1

J'ai appris here que, même si c'est la meilleure pratique et malgré le fait que la plupart des compilateurs vous y obligent, il n'est pas si strict d'avoir des fichiers .class nommés d'après la classe publique qu'ils contiennent, à moins d'un point de vue de la spécification de la langue.Java Convention de dénomination de langage pour les fichiers .class

J'ai recherché les spécifications JLS et JVM, mais je n'ai pas réussi à trouver le chapitre où ce sujet est traité. Il me semble étrange que ce problème ne soit pas traité . Où, s'il existe, un document Oracle officiel peut-il confirmer ou annuler l'affirmation suivante?

Giving .class fichiers que le même nom que la classe publique qu'ils contiennent - s'ils le font - est tout simplement un must, mais selon la JLS ce n'est pas stricte. Du point de vue de JLS, il est laissé au compilateur de choisir ou non de définir une telle restriction.

+0

j'utiliser un numéro de chapitre ou de la page pour accéder plus à ce sujet dans les publications/écrits. – Salvioner

+0

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

+0

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

Répondre

2

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) » ...

+0

Merci! A propos de la première partie de la déclaration, j'aurais dû préciser "s'ils contiennent une classe publique du tout" ... Cela ne veut pas dire cela.class file * must * contient une classe publique mais que, s'ils le font, ils devraient (à en juger par votre réponse c'est juste une bonne habitude de programmation, mais ils devraient quand même) être nommés après le nom de cette classe. – Salvioner

+0

Le point clé est, vous devez suivre la convention de nommage si vous voulez que l'algorithme de recherche standard, comme implémenté par 'URLClassLoader', fonctionne. Sinon, vous devrez implémenter votre propre chargeur (bien que cela ne soit pas si difficile si seul le nom diffère). Dans le cas de Java 9, il n'y a pas seulement une nouvelle implémentation de chargeur de classes, mais aussi une implémentation spéciale 'FileSystem' que les outils peuvent utiliser pour lire les modules. – Holger