Você não pode usar classes no pacote padrão de um pacote nomeado.
( Tecnicamente, você pode, conforme mostrado na resposta de Sharique Abdullah por meio da API de reflexão, mas as classes do namespace não nomeado não estão no escopo em uma declaração de importação )
Antes do J2SE 1.4, você podia importar classes do pacote padrão usando uma sintaxe como esta:
import Unfinished;
Isso não é mais permitido . Portanto, para acessar uma classe de pacote padrão de dentro de uma classe em pacote, é necessário mover a classe de pacote padrão para um pacote próprio.
Se você tiver acesso à fonte gerada pelo groovy, algum pós-processamento é necessário para mover o arquivo para um pacote dedicado e adicionar esta diretiva "pacote" em seu início.
Atualização de 2014: bug 6975015 , para JDK7 e JDK8, descreve uma proibição ainda mais rígida contra importação de pacote sem nome.
A TypeName
deve ser o nome canônico de um tipo de classe, tipo de interface, tipo de enum, ou tipo de anotação.
O tipo deve ser um membro de um pacote nomeado ou um membro de um tipo cujo tipo mais externo lexicalmente envolvente é um membro de um pacote nomeado , ou ocorrerá um erro em tempo de compilação .
Andreas aponta nos comentários :
"por que [o pacote padrão] está lá em primeiro lugar? erro de design?"
Não, é deliberado.
JLS 7.4.2. Pacotes sem nome diz: "Pacotes sem nome são fornecidos pela plataforma Java SE principalmente por conveniência ao desenvolver aplicativos pequenos ou temporários ou apenas quando o desenvolvimento está começando".
Na verdade, você pode.
Usando a API de reflexões você pode acessar qualquer classe até agora. Pelo menos consegui :)
fonte
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")
Use jarjar para recompactar o arquivo jar com a seguinte regra:
Todas as classes no pacote padrão do arquivo jar de origem serão movidas para o pacote de destino, portanto, podem acessar.
fonte
Você pode usar pacotes no
Groovy
código e as coisas funcionarão muito bem.Pode significar uma pequena reorganização do código
grails-app
e um pouco mais difícil no início, mas em um grande projeto grails, faz sentido organizar as coisas em pacotes. Usamos a convenção de nomenclatura de pacote padrão Javacom.foo.<app>.<package>
.Ter tudo no pacote padrão se torna um obstáculo à integração, como você está descobrindo.
Os controladores parecem ser o único artefato Grails (ou artefato) que resiste a ser colocado em um pacote Java. Provavelmente ainda não descobri o
Convention
que fazer. ;-)fonte
só para completar a ideia:
De dentro do pacote padrão, você pode acessar objetos residentes em pacotes nomeados.
fonte