提问者:小点点

如何在默认包中访问Java-类?


我现在和其他人一起工作在一个grails项目中。 我得写一些Java-类。 但我需要访问用Groovy创建的可搜索对象。 看起来,这个对象必须放在default-package中。

我的问题是:有没有一种方法从命名包中的Java类访问默认包中的这个对象?


共3个答案

匿名用户

您不能在来自命名包的默认包中使用类。
(技术上可以,如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文件默认包中的所有类都将移动到目标包中,从而能够访问。