Java:如何引用库依赖*没有*'import'语句?

时间:2015-11-12 19:28:16

标签: java netbeans import

我正在使用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来引用此库类而不“导入”它?

5 个答案:

答案 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。