Vous ne pouvez pas utiliser de classes dans le package par défaut à partir d'un package nommé.
( Techniquement, vous pouvez, comme indiqué dans la réponse de Sharique Abdullah via l'API de réflexion, mais les classes de l'espace de noms sans nom ne sont pas dans la portée d'une déclaration d'importation )
Avant J2SE 1.4, vous pouviez importer des classes à partir du package par défaut en utilisant une syntaxe comme celle-ci:
import Unfinished;
Ce n'est plus autorisé . Ainsi, pour accéder à une classe de package par défaut depuis 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 post-traitement est nécessaire pour déplacer le fichier dans un package dédié et ajouter cette directive "package" à son début.
Mise à jour 2014: le bogue 6975015 , pour JDK7 et JDK8, décrit une interdiction encore plus stricte contre l'importation depuis un paquet sans nom.
Le TypeName
doit être le nom canonique d'un type de classe, d'un type d'interface, d'un type d'énumération ou d'un type d'annotation.
Le type doit être soit un membre d'un package nommé , soit un membre d'un type dont le type englobant lexicalement le plus externe est membre d'un package nommé , ou une erreur de compilation se produit .
Andreas souligne dans les commentaires :
"pourquoi [le package par défaut] est-il là en premier lieu? erreur de conception?"
Non, c'est délibéré.
JLS 7.4.2. Unnamed Packages dit: "Les packages 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 au début du développement".
En fait, vous pouvez.
En utilisant l'API réflexions, vous pouvez accéder à n'importe quelle classe jusqu'à présent. Au moins j'ai pu :)
la source
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Utilisez jarjar pour reconditionner le fichier jar avec la règle suivante:
Toutes les classes du package par défaut du fichier jar source seront déplacées vers le package cible et pourront donc y accéder.
la source
Vous pouvez utiliser des packages dans
Groovy
code, 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 gros projet Grails, il est juste logique d'organiser les choses dans des packages. Nous utilisons la convention de dénomination de package standard Javacom.foo.<app>.<package>
.Tout avoir dans le package par défaut devient un obstacle à l'intégration, comme vous le constatez.
Les contrôleurs semblent être le seul artefact Grails (ou artefact) qui résiste à être placé dans un package Java. Je n'ai probablement pas encore trouvé le
Convention
pour ça. ;-)la source
juste pour compléter l'idée:
Depuis l'intérieur du package par défaut, vous pouvez accéder aux objets résidant dans des packages nommés.
la source