views:

4979

answers:

3

I'm working now together with others in a grails project. I have to write some Java-classes. But I need access to an searchable object created with groovy. It seems, that this object has to be placed in the default-package. My question is: Exists a way to access this object in the default-package from a Java-class in a named package?

+14  A: 

You can’t use classes in the default package from a named package.

Prior to J2SE 1.4 you could import classes from the default package using a syntax like this:

import Unfinished;

That's no longer allowed. So to access a default package class from within a packaged class requires moving the default package class into a package of its own.

If you have access to the source generated by groovy, some post-processing is needed to move the file into a dedicated package and add this "package" directive at its beginning.

VonC
As I've explained to other people before, the default package is a second-class citizen in the Java world. Just Don't Do That. :-)
Chris Jester-Young
Seems I have to learn Groovy (on a very time-constrained project) or code in the default-package. :-(
Mnementh
A: 

You can use packages in the Groovy code, and things will work just fine.

It may mean a minor reorganization of code under grails-app and a little bit of a pain at first, but on a large grails project, it just make sense to organize things in packages. We use the Java standard package naming convention com.foo.<app>.<package>.

Having everything in the default package becomes a hindrance to integration, as you're finding.

Controllers seem to be the one Grails artifact (or artefact) that resists being put in a Java package. Probably I just haven't figured out the Convention for that yet. ;-)

Ken Gentle
+3  A: 

In fact, you can.

Using reflections API you can access any class so far. At least I was able to :)

Class fooClass = Class.forName("FooBar"); Method fooMethod = fooClass.getMethod("fooMethod", new Class[] { String.class });

String fooReturned = fooMethod.invoke(fooClass.newInstance(), new String[] { "I did it"}).toString();