我现在和其他人一起在grails项目中工作。我必须编写一些Java类。但我需要访问使用groovy创建的可搜索对象。看来,这个对象必须放在default-package中。
我的问题是:有没有办法从命名包中的Java类访问default-package中的这个对象?
答案 0 :(得分:120)
You can’t use个类 (技术上你可以,如Sharique Abdullah的answer通过反射API所示,但来自未命名命名空间的类不在范围在导入声明)
在J2SE 1.4之前,您可以使用如下语法从默认包中导入类:
import Unfinished;
那是no longer allowed。因此,要从打包的类中访问默认包类,需要将默认包类移动到它自己的包中。
如果您可以访问groovy生成的源代码,则需要进行一些后处理才能将文件移动到专用包中,并在其开头添加此“package”指令。
更新2014:bug 6975015,对于JDK7和JDK8,描述了一个甚至更严格的禁止从未命名的包导入。
TypeName
必须是类类型,接口类型,枚举类型或注释类型的规范名称。
该类型必须是命名包的成员,或者是最外层词汇封闭类型是命名包,或的成员的类型的成员发生编译时错误。
“为什么[默认包]首先出现?设计错误?”
不,这是故意的 JLS 7.4.2. Unnamed Packages说:“Java SE平台提供了未命名的软件包,主要是为了方便开发小型或临时应用程序或刚开始开发时。”
答案 1 :(得分:59)
事实上,你可以。
使用Reflections API,您可以访问任何类到目前为止。至少我能够:)
Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);
String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");
答案 2 :(得分:7)
答案 3 :(得分:3)
您可以在Groovy
代码中使用软件包,一切正常。
这可能意味着grails-app
下的代码重新进行了轻微的重组,起初有点痛苦,但是在一个大型的grails项目中,组织包装中的东西才有意义。我们使用Java标准包命名约定com.foo.<app>.<package>
。
将所有内容都放在默认包中会成为集成的障碍,正如您所发现的那样。
控制器似乎是一个Grails工件(或人工制品),它不会被放入Java包中。可能我还没有想出Convention
。 ; - )
答案 4 :(得分:0)
只是为了完成这个想法:
从内部默认程序包中,您可以访问驻留在命名程序包中的对象。