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

Mne*_*nth 95 java groovy default-package

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

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

Von*_*onC 123

您不能在命名包中使用默认包中的类.
(从技术上就可以了,如图Sharique阿卜杜拉的回答通过反射API,但是从无名命名空间的类是不在范围内进口申报)

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

import Unfinished;
Run Code Online (Sandbox Code Playgroud)

那是不允许的.因此,要从打包的类中访问默认包类,需要将默认包类移动到它自己的包中.

如果您可以访问groovy生成的源代码,则需要进行一些后处理以将文件移动到专用包中,并在其开头添加此"package"指令.


更新2014:JDK7和JDK8的错误6975015描述了一个更严格的禁止从未命名的包导入的禁令.

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

  • @ ChrisJester-Young如果是这样,为什么它首先出现在那里?设计错误? (11认同)
  • 正如我之前向其他人解释的那样,默认包是Java世界中的二等公民.只是不要这样做.:-) (7认同)

小智 60

事实上,你可以.

使用Reflections API,您可以访问任何类到目前为止.至少我能够:)

Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,+1。然而,由于这个问题很有趣,你可以使用鸭子打字(我猜就像管道录音)......`Class.forName("FooBar").newInstance().fooMethod("I did it")` (2认同)

小智 7

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

rule * <target package name>.@1
Run Code Online (Sandbox Code Playgroud)

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

  • 一个如何使用jarjar的演示会很棒 (4认同)