2008-11-12 10 views
86

Estoy trabajando ahora junto con otros en un proyecto de grails. Tengo que escribir algunas clases de Java. Pero necesito acceder a un objeto de búsqueda creado con groovy. Parece que este objeto debe colocarse en el paquete predeterminado.¿Cómo acceder a las clases de Java en el paquete predeterminado?

Mi pregunta es: ¿Hay alguna manera de acceder a este objeto en el paquete predeterminado de una clase Java en un paquete con nombre?

Respuesta

115

You can’t use clases en el paquete predeterminado de un paquete con nombre.
(Técnicamente se puede, como se muestra en Sharique Abdullah de answer través de la API de reflexión, pero clases del espacio de nombres sin nombre no son alcance en una declaración importación)

Antes de J2SE 1.4 se podía importar clases del paquete por defecto utilizando una sintaxis como esta:

import Unfinished; 

Eso es no longer allowed. Por lo tanto, para acceder a una clase de paquete predeterminada desde dentro de una clase empaquetada, se requiere mover la clase de paquete predeterminada a un paquete propio.

Si tiene acceso a la fuente generada por groovy, se necesita algo de postprocesamiento para mover el archivo a un paquete dedicado y agregar esta directiva de "paquete" al principio.


Actualización 2014: bug 6975015, por JDK7 y JDK8, describen una aún más estricta prohibición de la importación de paquete sin nombre.

El TypeName debe ser el nombre canónico de un tipo de clase, tipo de interfaz, tipo de enumeración, o tipo de anotación.
El tipo debe ser un miembro de un llamado paquete de, o un miembro de un tipo cuya más externa léxicamente envolvente tipo es un miembro de un paquete llamado, o un error de tiempo de compilación se produce.

+7

Como ya le expliqué a otras personas, el paquete predeterminado es un ciudadano de segunda clase en el mundo de Java. Simplemente no hagas eso. :-) –

+1

Parece que tengo que aprender Groovy (en un proyecto muy limitado) o código en el paquete predeterminado. :-( – Mnementh

+11

@ ChrisJester-Young si es así ¿por qué está allí en primer lugar? Error de diseño? – Pacerier

3

Puede usar paquetes en el código Groovy, y las cosas funcionarán bien.

Puede significar una reorganización menor de código bajo grails-app y un poco de dolor al principio, pero en un proyecto de gran grails, simplemente tiene sentido organizar cosas en paquetes. Usamos la convención de nomenclatura de paquetes estándar de Java com.foo.<app>.<package>.

Tener todo en el paquete predeterminado se convierte en un obstáculo para la integración, como usted está encontrando.

Los controladores parecen ser el único artefacto (o artefacto) de Grails que se resiste a colocarse en un paquete de Java. Probablemente aún no he descubierto el Convention para eso. ;-)

58

De hecho, puedes.

Usando la API Reflections puede acceder a cualquier clase hasta ahora.Al menos pude :)

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

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

Para Scala, el siguiente código funciona: 'val bar =" hi "; val fooClass = Class.forName ("FooClass"); val fooMethod = fooClass.getMethod ("foo", classOf [Array [String]]); val fooReturned = fooMethod.invoke (fooClass.newInstance(), Array (bar)); ' – Jus12

+1

Gran respuesta, +1. Sin embargo, dado que la pregunta era maravillosa, puedes usar la tipificación de pato (como Duct taping, supongo) ... 'Class.forName (" FooBar "). NewInstance(). FooMethod (" Lo hice ")' –

6

Uso jarjar volver a empaquetar el archivo jar con la siguiente regla:

rule * <target package name>[email protected] 

Todas las clases del paquete por defecto del archivo jar fuente se moverán a la meta paquete, por lo tanto, pueden acceder.

+4

una demostración de cómo usar jarjar sería grandioso – BiGGZ

+0

@BiGGZ: Vea el archivo [README.md] (https://github.com/shevek/jarjar/blob/master/README.md) en el repositorio jarj github para ver cómo usarlo jarjar con hormiga, gradle o la línea de comando. – Lucidiot

Cuestiones relacionadas