如何在默认包中访问java类?
2022-08-31 09:56:00
我现在正在与其他人一起在一个圣杯项目中工作。我必须编写一些Java类。但是我需要访问使用groovy创建的可搜索对象。似乎必须将此对象放在默认包中。
我的问题是:有没有办法从命名包中的Java类访问默认包中的此对象?
我现在正在与其他人一起在一个圣杯项目中工作。我必须编写一些Java类。但是我需要访问使用groovy创建的可搜索对象。似乎必须将此对象放在默认包中。
我的问题是:有没有办法从命名包中的Java类访问默认包中的此对象?
不能使用命名包中默认包中的类。
(从技术上讲,你可以,如Sharique Abdullah通过反射API的答案所示,但来自未命名命名空间的类不在导入声明的范围之内。)
在 J2SE 1.4 之前,您可以使用如下语法从缺省包导入类:
import Unfinished;
这不再是允许的。因此,要从打包类中访问默认包类,需要将默认包类移动到它自己的包中。
如果您有权访问 groovy 生成的源代码,则需要进行一些后处理才能将文件移动到专用包中,并在其开头添加此“package”指令。
2014年更新:JDK7 和 JDK8 的 bug 6975015描述了更严格的禁止从未命名包导入。
必须是类类型、接口类型、枚举类型或注释类型的规范名称。
该类型必须是命名包的成员,或者是其最外层的词法封闭类型是命名包的成员的类型的成员,否则会发生编译时错误。TypeName
“为什么[默认包]首先存在?设计错误?
不,这是故意的。
JLS 7.4.2.未命名的软件包说:“未命名的软件包由Java SE平台提供,主要是为了方便开发小型或临时应用程序或刚开始开发时”。
事实上,你可以。
使用反射 API,到目前为止,您可以访问任何类。至少我能够:)
Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);
String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");