这个问题困扰了我一段时间。
在像泽西岛这样的框架中,我们可以使用接口来为我们的程序添加一些功能。例如,要在RESt应用程序中添加请求过滤,我们可以实现ContainerRequestFilter,然后我们获得认证。
我的问题是框架/库如何知道我们有一个接口的子类?
根据我的理解,你不能实例化一个接口,只有它的子类如:
public interface Greeter{
void sayHi();
}
public class SpanishGreeter implements Greeter{
@override
void sayHi(){
System.out.println("Hola");
}
}
public class Controller{
public void main(String[] args){
//We must know the name of subclass to instantiate?
Greeter spanishG = new SpanishGreeter();
}
}
答案 0 :(得分:3)
您正在寻找的是类路径扫描。
这不是一项微不足道的任务,它几乎就是名称所说的:你基本上需要扫描类路径并加载你找到的每个类(虽然典型的实现将允许你将搜索限制在某些包及其中只有子包,才能阻止真正疯狂的事情。)
Java语言中没有任何特殊技巧可以简化此任务。
好消息是你不需要从头开始编写它,因为像Spring这样的框架已经内置了它,或者如果你想要完全的低级控制,你可以使用像{{{}这样的专用库。 3}}
答案 1 :(得分:0)
我认为instanceof关键字有助于此。
System.out.println(spanishG instanceof Greeter); // true
答案 2 :(得分:0)
由于多态性而发生这种情况。你提到的代码
Greeter spanishG = new SpanishGreeter();
有父母的参考(在你的情况下界面)。在运行时它检查天气有一个实现该方法的子类,如果是,则它调用子类行为。在您的类中,您在运行时使用子类进行实例化,JVM知道您已经提供了实现。