0

我正在自学创建可以在外部覆盖的类,基本上是为了模拟一个我只提供接口实现的框架。我注意到 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
    }
}
4

3 回答 3

0

在所有框架中,您都需要一个配置映射或组件注入的入口点。在您的示例中,这是 FrameworkDriver。不可能简单地扫描实现并动态加载它们。我会建议两种可能的解决方案之一。

1)您向 FrameworkDriver 添加一个方法,该方法创建在创建框架时使用的 FrameworkObject(扩展类需要覆盖 main,否则它将创建原始类的实例并错过此扩展)。这允许 FrameworkDriver 的其他实现覆盖它并提供替代实现。

2)您的驱动程序读取包含对象或其工厂的类名的系统属性或文件,因此您不再需要对其进行编码。许多依赖注入框架都使用了这种方法,有些通过生成文件来自动处理它从构建插件或其他源处理器。

一般来说,尽管您可能最好使用现成的系统,例如Guice

于 2013-11-12T21:15:54.293 回答
0

如果您正在寻找内置机制,那么自定义服务提供者可能是您的答案(自 Java 1.6 起可用)。

于 2013-11-12T21:23:41.167 回答
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);
}
}
于 2013-11-13T10:22:02.833 回答