102 votes

Comment accéder aux classes java dans le paquetage par défaut ?

Je travaille actuellement avec d'autres personnes sur un projet grails. Je dois écrire quelques classes Java. Mais j'ai besoin d'accéder à un objet consultable créé avec groovy. Il semble que cet objet doive être placé dans le paquetage par défaut.

Ma question est la suivante : Existe-t-il un moyen d'accéder à cet objet dans le paquetage par défaut à partir d'une classe Java dans un paquetage nommé ?

132voto

VonC Points 414372

Vous ne pouvez pas utiliser les classes du paquetage par défaut à partir d'un paquetage nommé.
( Techniquement vous le pouvez, comme le montre l'article de Sharique Abdullah. réponse par le biais de l'API de réflexion, mais les classes de l'espace de nom sans nom sont pas dans le champ d'application dans un déclaration d'importation )

Avant J2SE 1.4, vous pouviez importer des classes à partir du paquetage par défaut en utilisant une syntaxe comme celle-ci :

import Unfinished;

C'est n'est plus autorisé . Ainsi, pour accéder à une classe de package par défaut à partir d'une classe de package, il faut déplacer la classe de package par défaut dans un package qui lui est propre.

Si vous avez accès à la source générée par groovy, un certain post-traitement est nécessaire pour déplacer le fichier dans un paquetage dédié et ajouter cette directive "package" à son début.


Mise à jour 2014 : bug 6975015 pour JDK7 et JDK8, décrivent un processus d'amélioration de la qualité des services. plus stricte interdiction d'importer à partir d'un paquet sans nom.

Le site TypeName doit être le nom canonique d'un type de classe, d'interface, d'énumération ou d'annotation.
Le type doit être soit un membre d'un paquet nommé ou un membre d'un type dont le type lexical le plus extérieur est un membre d'un paquet nommé , ou une erreur de compilation se produit .


Andreas souligne dans les commentaires :

"pourquoi [le paquet par défaut] est-il là en premier lieu ? erreur de conception ?"

Non, c'est délibéré.
JLS 7.4.2. Paquets sans nom dit : "Les paquets sans nom sont fournis par la plate-forme Java SE principalement pour des raisons de commodité lors du développement d'applications petites ou temporaires ou lors du début du développement".

7 votes

Comme je l'ai déjà expliqué à d'autres personnes, le paquetage par défaut est un citoyen de seconde classe dans le monde Java. Ne faites pas ça :-)

1 votes

Il semble que je doive apprendre Groovy (sur un projet très limité en temps) ou coder dans le paquetage par défaut :-(.

11 votes

@ChrisJester-Young si oui, pourquoi est-il là en premier lieu ? erreur de conception ?

62voto

En fait, vous le pouvez.

En utilisant l'API de réflexion, vous pouvez accéder à n'importe quelle classe jusqu'à présent. Au moins, j'ai pu le faire :)

Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");

7voto

petrichory Points 11

Utilisez jarjar pour reconditionner le fichier jar avec la règle suivante :

rule * <target package name>.@1

Toutes les classes du paquetage par défaut du fichier jar source seront déplacées vers le paquetage cible, et pourront donc y accéder.

4 votes

Une démo de l'utilisation de Jarjar serait super.

0 votes

@BiGGZ : Voir le README.md sur le dépôt github de jarjar pour voir comment utiliser jarjar avec ant, gradle ou la ligne de commande.

3voto

Ken Gentle Points 10162

Vous pouvez utiliser les paquets dans le Groovy et les choses fonctionneront très bien.

Cela peut signifier une réorganisation mineure du code sous grails-app et un peu pénible au début, mais sur un grand projet grails, il est tout simplement logique d'organiser les choses en paquets. Nous utilisons la convention de nom de paquet standard de Java com.foo.<app>.<package> .

Avoir tout dans le paquetage par défaut devient un obstacle à l'intégration, comme vous le constatez.

Les contrôleurs semblent être le seul artefact (ou artefact) Grails qui résiste à l'idée d'être placé dans un paquetage Java. Il est probable que je n'ai pas encore compris le fonctionnement de l'outil Convention pour l'instant. ;-)

0voto

Duracell De Monaco Points 1146

juste pour compléter l'idée :

De l'intérieur default-package vous pouvez accéder aux objets résidant dans les paquets nommés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X