我正在使用NetBeans,而我正在将通用类分解为库。我想引用库中的类。通过告诉NetBeans一个项目依赖于另一个项目,后者是一个Java库项目,我可以很容易地做到这一点。
库项目名为“ReVueLib”。我有一个名为“Stream”的文件夹,并且有一个类“StreamClient”。以下是重要的删节版本:
package Stream;
class StreamClient {
public void StreamClient() {}
};
我有另一个名为“ReVueServer”的项目,主要看起来像这样:
package revueserver;
import Stream.StreamClient;
public class ReVueServer {
public static void main(String[] args) {
Class c = StreamClient.class;
System.out.println(c.getName());
}
};
现在如果我运行它,它工作正常并打印出“Stream.StreamClient”。但是说我想引用这个类而不用导入。原因是在另一个项目中,我想将Network.StreamClient子类化为一个名为StreamClient的类。这将帮助我避免重构现有代码的TON。换句话说,我利用命名空间分离能够子类化并重用旧名称。
不幸的是,如果我取出导入,“Stream.StreamClient”不起作用,也没有“ReVueLib.Stream.StreamClient”或我尝试过的任何其他内容。
我需要使用哪些FQCN来引用此库类而不“导入”它?
答案 0 :(得分:2)
包中类的正确名称包括包的全名。 import
语句允许您避免编写前缀,但这是一个编译时技巧。这就是为什么您的程序打印完全限定名称Stream.StreamClient
,即使您的程序通过其短名称StreamClient
引用该类。
您可以随时重写程序,以便为所有课程使用全名:
Class c = Stream.StreamClient.class;
甚至
java.lang.Class c = Stream.StreamClient.class;
答案 1 :(得分:2)
Stream.StreamClient是FQCN,您应该能够删除导入并使用它。
答案 2 :(得分:1)
我认为你需要一个比“不工作”更好的解释。为什么这不起作用?
package revueserver;
public class ReVueServer {
public static void main(String[] args) {
Class c = Stream.StreamClient.class;
System.out.println(c.getName());
}
}
答案 3 :(得分:0)
我会赞成很多好的答案。事实证明,问题是虚假的。我有一个命名冲突。在尝试添加对Stream命名空间的引用之前,我已经忘记删除了一个Stream类。类名优先于外部名称空间。
答案 4 :(得分:-1)
如果不导入类API,则无法引用它(通过import或explicity完全限定引用)。永远。多数民众赞成。
我认为你的误解是你可以在某处写“Stream.class”,并且根据类路径上的内容它会起作用。这只是在非常有限的范围内。虽然您可以将Stream.class替换为具有相同限定名称和API的另一个类(即方法和引用字段),但类始终由其限定名称引用(那个包+类名。)
您的问题听起来更像是需要使用通用API进行依赖注入。这允许您选择相同API 的不同实现。
这通常通过定义API来实现,无论是作为接口还是作为抽象类:
package my.common;
public interface MyAPI {
public void doSomething();
}
您的程序代码只能 在定义的接口上运行,您需要在类路径上进行编译和运行。
然后,您可以随意定义任意数量的接口实现:
package my.green;
public GreenAPI implements MyAPI {
public void doSomething() {
System.out.println("You reached green API");
}
}
最后,您需要向程序注入如何在运行时获取实现的信息。在最简单的情况下,这可以通过将类名作为参数传递到某处来完成,还有框架来执行此操作:
package something;
import my.common.MyAPI;
public MyAPIUser {
public static void main(String[] args) {
try {
Class<?> apiImpl = Class.forName("my.green.GreenAPI");
MyAPI api = (MyAPI) apiImpl.newInstance();
api.doSomething();
} catch (Exception e) {
e.printStakcTrace();
}
}
}
多数民众赞成,JRE如何设法为所有JDBC驱动程序提供通用API。