我现在和其他人一起在grails项目中工作.我必须编写一些Java类.但我需要访问使用groovy创建的可搜索对象.看来,这个对象必须放在default-package中.
我的问题是:有没有办法从命名包中的Java类访问default-package中的这个对象?
我正在使用Eclipse 3.5,我创建了一个包含一些包结构和默认包的项目.我在默认包中有一个类 - Calculations.java,我想在任何一个包中使用该类(例如in com.company.calc).当我尝试使用默认包中的类时,它给了我一个编译器错误.它无法识别默认包中的类.问题出在哪儿?
Calculations.java - 源代码
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Run Code Online (Sandbox Code Playgroud)
我不能把我的班级放在任何其他包中.这个类有一些在Delphi中实现的本机方法.如果我将该类放在任何文件夹中,我将不得不对我想要避免的DLL进行更改(实际上 - 我不能).这就是为什么我把我的类放在默认包中.
是否可以将 jar 中的 .class 文件从默认包移动到另一个命名包,以便我可以导入和使用它们?
在这里浏览其他问题后,我认为 jarjar 可能正是我要找的,但我不知道如何使用它。
所以我的问题是如何使用 jarjar 将 .class 文件从默认包重新打包到另一个命名包?
编辑:我想澄清一些事情 - 我没有要重新打包的 jar 的来源,所以我不知道如何重新编译代码。混淆和反射是不可能的。
EDIT2:使用 jarjar 似乎非常简单:) java -jar jarjar.jar process rules.rules in.jar out.jar
rules.rules 看起来像这样: rule a net.ylivay.src.a
问题解决了!
我从K&B书"SCJP Sun认证程序员Java 6学习指南"中获取了以下代码:
class A { // 1
void m() {
System.out.println("outer");
}
}
public class TestInners {
public static void main(String[] args) {
new TestInners().go();
}
void go() {
new A().m();
class A { // 2
void m() {
System.out.println("inner");
}
}
}
class A { // 3
void m() {
System.out.println("middle");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如书中所述,此代码打印"中间".我推断标记为"3"的类声明是标记为"1"的类,它是TestInners类的外部.如果这些类在不同的包中,我可以通过使用包名来限定其中一个来解决歧义.但在这种情况下,类不仅在同一个包中,而且在同一个文件中.如何获取外部类的实例?
我在这里看到了同样的问题,但是接受的答案意味着修改代码,为整个事物添加一个封闭的类.我的问题是如何使用任何类型的限定符或引用来获取实例,如果它甚至可能的话.
为什么不建议在JAVA中使用默认包?虽然我理解为了可维护性和可读性目的而拥有更合理和描述性的包名更有意义,但是还有其他原因吗?
我是java的新手,当我创建一个项目时,它创建了src和JRE系统库.它没有创建的是默认包.当我在src中创建一个类时,它会在项目之后命名它.它要求我把包(项目名称).我不想.我如何制作默认值
包.

