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

时间:2008-11-12 12:36:22

标签: java groovy default-package

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

我的问题是:有没有办法从命名包中的Java类访问default-package中的这个对象?

5 个答案:

答案 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必须是类类型,接口类型,枚举类型或注释类型的规范名称。
  该类型必须是命名包的成员,或者是最外层词汇封闭类型是命名包的成员的类型的成员发生编译时错误


Andreas指出in the comments

  
    

“为什么[默认包]首先出现?设计错误?”

  
     

不,这是故意的   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)

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

rule * <target package name>.@1

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

答案 3 :(得分:3)

您可以在Groovy代码中使用软件包,一切正常。

这可能意味着grails-app下的代码重新进行了轻微的重组,起初有点痛苦,但是在一个大型的grails项目中,组织包装中的东西才有意义。我们使用Java标准包命名约定com.foo.<app>.<package>

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

控制器似乎是一个Grails工件(或人工制品),它不会被放入Java包中。可能我还没有想出Convention。 ; - )

答案 4 :(得分:0)

只是为了完成这个想法:

从内部默认程序包中,您可以访问驻留在命名程序包中的对象。