如何访问默认包中的java类?
我现在正与其他人一起参与grails项目。我必须编写一些Java类。但我需要访问用groovy创建的可搜索对象。看起来,这个对象必须放在默认包中 我的问题是:是否有方法从命名包中的Java类访问默认包中的此对象?从命名包访问默认包中的类。如何访问默认包中的java类?,java,groovy,default-package,Java,Groovy,Default Package,我现在正与其他人一起参与grails项目。我必须编写一些Java类。但我需要访问用groovy创建的可搜索对象。看起来,这个对象必须放在默认包中 我的问题是:是否有方法从命名包中的Java类访问默认包中的此对象?从命名包访问默认包中的类。 (从技术上讲,您可以,如Sharique Abdullah的through reflection API所示,但是来自未命名名称空间的类在导入声明中不在范围内) 在J2SE 1.4之前,您可以使用如下语法从默认包导入类: import Unfinished;
(从技术上讲,您可以,如Sharique Abdullah的through reflection API所示,但是来自未命名名称空间的类在导入声明中不在范围内) 在J2SE 1.4之前,您可以使用如下语法从默认包导入类:
import Unfinished;
那太好了。因此,要从打包类中访问默认包类,需要将默认包类移动到它自己的包中
如果您可以访问groovy生成的源代码,则需要进行一些后处理,以将文件移动到专用包中,并在其开头添加此“package”指令
2014年更新:对于JDK7和JDK8,描述了更严格的禁止从未命名软件包进口的规定
TypeName
必须是类类型、接口类型、枚举类型或注释类型的规范名称。该类型必须是命名包的成员,或者是其最外层词汇封闭类型是命名包的成员的类型的成员,,否则会发生编译时错误
指出: “为什么[默认包]首先存在?设计错误?” 不,这是故意的。
他说:“JavaSE平台提供未命名的包主要是为了方便开发小型或临时应用程序或刚开始开发时使用”
您可以在
Groovy
代码中使用包,一切都会正常工作
这可能意味着在grails app
下对代码进行了一次小的重组,一开始会有点麻烦,但在一个大型grails项目中,在包中组织东西才有意义。我们使用Java标准包命名约定com.foo..
正如您所发现的,将所有内容都放在默认包中会成为集成的障碍
控制器似乎是一个Grails工件(或人工制品),它拒绝放入Java包中。也许我还没有弄清楚这方面的惯例 事实上,你可以
使用反射API,到目前为止,您可以访问任何类。至少我能:)
使用以下规则重新打包jar文件:
rule * <target package name>.@1
规则*@1
源jar文件的默认包中的所有类都将移动到目标包中,因此可以访问。为了完成这个想法:
从默认包内部您可以访问位于命名包中的对象。正如我之前向其他人解释的,默认包是Java世界中的二等公民。不要那样做。:-)似乎我必须学习Groovy(在时间非常有限的项目上)或默认包中的代码:-(@ChrisJester-Young如果是这样的话,为什么它首先存在?设计错误?为什么它被弃用?@SuzanCioc你的意思是:“为什么在J2SE1.4之后,你不能再访问默认包了?”对于Scala,下面的代码起作用:
val-bar=“hi”;val-fooClass=Class.forName(“fooClass”);val-foocmethod=fooClass.getMethod(“foo”,classOf[Array[String]];val fooReturned=fooMethod.invoke(fooClass.newInstance(),Array(bar));
回答得很好,+1.但是,因为问题是groovy,所以您可以使用duck类型(我想是管道胶带).Class.forName(“FooBar”).newInstance().fooMethod(“我做到了”)
好吧,如果我从两个不同的jar文件中有两个名为FooBar的类,那么将调用哪一个呢?一个如何使用jarjar的演示将是great@BiGGZ:查看jarjar github repo上的文件,了解如何将jarjar与ant、gradle或命令行一起使用。
rule * <target package name>.@1