如何访问default-package中的java-classes?

我正在和其他人一起在Grails项目中工作。 我必须编写一些Java类。 但我需要访问一个用groovy创build的可search对象。 看来,这个对象必须放在默认包中。

我的问题是: 有没有办法从指定的包中的Java类的默认包中访问此对象?

您不能使用命名包中的默认包中的类。
从技术上讲,你可以,如Sharique Abdullah通过reflectionAPI的回答所示, 但是来自未命名名称空间的类不在 导入声明的 范围内

在J2SE 1.4之前,您可以使用如下语法从默认包导入类:

import Unfinished; 

这不再允许 。 因此,要从一个打包的类中访问一个默认的包类,需要将这个默认的包类移动到它自己的包中。

如果你有权访问groovy生成的源代码,需要进行一些后期处理将文件移动到一个专用包中,并在其开头添加这个“包”指令。


更新2014年:对于JDK7和JDK8, 错误6975015描述了更严格的禁止从未命名包导入的问题。

TypeName必须是类types,接口types,枚举types或注释types的规范名称。
该types必须是已命名包的成员,或者是最外面的词法封闭types是已命名包的成员的types的成员, 否则会发生编译时错误

其实你可以。

使用reflectionAPI,您可以访问任何类到目前为止。 至less我能够:)

 Class fooClass = Class.forName("FooBar"); Method fooMethod = fooClass.getMethod("fooMethod", String.class); String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it"); 

使用jarjar使用以下规则重新打包jar文件:

 rule * <target package name>.@1 

源jar文件的默认包中的所有类将移动到目标包,从而能够访问。

你可以在Groovy代码中使用包,事情就可以正常工作。

这可能意味着在grails-app下对代码进行小规模的重组,一开始有一点点痛苦,但是对于一个大型的grails项目来说,把东西封装起来才是有意义的。 我们使用Java标准包命名约定com.foo.<app>.<package>

正如您所发现的那样,将所有内容都放在默认包中会成为集成的障碍。

控制器似乎是一个拒绝放在Java包中的Grails工件(或artefact)。 也许我还没有想出这个Convention呢。 😉