我正在教自己创建可以在外部覆盖的类,基本上是为了模拟一个我只提供接口实现的框架。 我注意到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
}
}
答案 0 :(得分:0)
在所有框架中,您都需要一个配置映射或组件注入的入口点。在您的示例中,这是FrameworkDriver。 简单地扫描实现并动态加载它们是不可能的。我会建议两种可能的解决方案之一。
1)向FrameworkDriver添加一个方法,该方法创建用于创建框架的FrameworkObject(扩展类需要覆盖main,否则它将创建原始类的实例并错过此扩展) 。这允许FrameworkDriver的其他实现覆盖它并提供替代实现。
2)您的驱动程序读取系统属性或文件,其中包含对象或其工厂的类名,因此您不再需要对其进行编码。许多依赖注入框架已使用此方法,并且一些自动处理它从构建插件或其他源处理器生成文件。
一般情况下,您可能最好使用现成的系统,例如Guice。
答案 1 :(得分:0)
如果您正在寻找内置机制,那么自定义Service Provider可能是您的答案(自Java 1.6起可用)。
答案 2 :(得分:0)
这是我快速解决问题的方法,然后它可以将任何类转换为FrameworkInterface ...想想这就是你的意思ajwillia.ms?
public class FrameworkFactory {
public static void doStuff(Class<?> class1) throws Exception{
FrameworkInterface fi = (FrameworkInterface) class1.newInstance();
fi.PrintStuff();
}
}
public class FrameworkDriver {
public static void main(String[] args) throws Exception{
FrameworkFactory.doStuff(FrameworkObject.class);
}
}