关闭。这个问题需要details or clarity .它目前不接受答案。
想改进这个问题?通过 editing this post 添加详细信息并澄清问题.
8年前关闭。
Improve this question
我正在自学创建可以在外部覆盖的类,基本上是为了模拟一个我只提供接口(interface)实现的框架。
我注意到 hadoop 实际上使用:
job.setMapperClass(FrameworkObject.class);
在驱动程序类中执行此操作,是否可以简单地更改下面的代码来执行此操作?
//----- locked framwork interface...
public interface FrameworkInterface {
public void PrintStuff();
}
//----- locked framwork factory class...
public class FrameworkFactory {
public static void doStuff(FrameworkInterface fi){
fi.PrintStuff();
}
}
//------------ my code that hooks into a framework...
public class FrameworkObject implements FrameworkInterface {
public FrameworkObject() {
// TODO Auto-generated constructor stub
}
@Override
public void PrintStuff() {
System.out.println("the implemented method...");
}
}
//------------ the framework driver I want to change
public class FrameworkDriver {
public static void main(String[] args){
FrameworkFactory.doStuff(new FrameworkObject()); // explicit ref to object
}
}
最佳答案
在所有框架中,您都需要一个配置映射或组件注入(inject)的入口点。在您的示例中,这是 FrameworkDriver。
不可能简单地扫描实现并动态加载它们。我会建议两种可能的解决方案之一。
1)您向 FrameworkDriver 添加一个方法,该方法创建在创建框架时使用的 FrameworkObject(扩展类需要覆盖 main,否则它将创建原始类的实例并错过此扩展)。这允许 FrameworkDriver 的其他实现覆盖它并提供替代实现。
2)您的驱动程序读取包含对象或其工厂的类名的系统属性或文件,因此您不再需要对其进行编码。许多依赖注入(inject)框架都使用了这种方法,有些通过生成文件来自动处理它从构建插件或其他源处理器。
一般来说,尽管使用现成的系统(例如 Guice)可能会更好。 .
关于java - 如何使用 java 接口(interface)在外部提供实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19939732/