我现在和其他人一起工作在一个grails项目中。 我得写一些Java-类。 但我需要访问用Groovy创建的可搜索对象。 看起来,这个对象必须放在default-package中。
我的问题是:有没有一种方法从命名包中的Java类访问默认包中的这个对象?
您不能在来自命名包的默认包中使用类。
(技术上可以,如Sharique Abdullah通过反射API的回答所示,但是来自未命名命名空间的类不在导入声明的范围内)
在J2SE1.4之前,您可以使用以下语法从默认包导入类:
import Unfinished;
那已经不允许了。 因此,要从打包类中访问默认包类,需要将默认包类移动到它自己的包中。
如果您有权访问groovy生成的源代码,则需要进行一些后处理,将文件移动到一个专用包中,并在其开头添加这个“package”指令。
更新2014:错误6975015,针对JDK7和JDK8,描述了更严格的禁止从未命名包导入。
TypeName
必须是类类型,接口类型,枚举类型或批注类型的规范名称。
该类型必须是命名包的成员,或者是其最外层词法封闭类型为命名包成员的类型的成员,否则将发生编译时错误。
安德烈亚斯在评论中指出:
“最初为什么会出现(默认包)?设计错误?”
不,这是故意的。
JLS 7.4.2。 Unnamed Packages表示:“Unnamed Packages是由Java SE平台提供的,主要是为了在开发小型或临时应用程序或刚开始开发时提供方便”。
事实上,你可以。
使用reflections API,您可以访问到目前为止的任何类。 至少我能够:)
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文件默认包中的所有类都将移动到目标包中,从而能够访问。