如何使用java接口提供外部实现

如何使用java接口提供外部实现,java,hadoop,frameworks,overriding,implementation,Java,Hadoop,Frameworks,Overriding,Implementation,我在自学如何创建可以在外部重写的类,基本上是为了模拟一个只为接口提供实现的框架。 我注意到hadoop实际上使用: setMapperClass(FrameworkObject.class) 在驱动程序类中,要做到这一点,是否需要对下面的代码进行简单的修改 //----- locked framwork interface... public interface FrameworkInterface { public void PrintStuff(); } //----- locke

我在自学如何创建可以在外部重写的类,基本上是为了模拟一个只为接口提供实现的框架。 我注意到hadoop实际上使用:

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
    }
}

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

1) 您向FrameworkDriver添加了一个方法,该方法创建框架创建过程中使用的FrameworkObject(扩展类需要重写main,否则它将创建原始类的实例并错过此扩展)。这使得FrameworkDriver的其他实现可以覆盖这一点,并提供另一种实现

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


一般来说,虽然您最好使用现成的系统,例如。

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

这是我解决问题的快速方法,然后需要任何可以转换到FrameworkInterface的类。。。你以为这就是你的意思吗

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);
}
}
公共类框架工厂{
公共静态void doStuff(类class1)引发异常{
FrameworkInterface fi=(FrameworkInterface)class1.newInstance();
fi.PrintStuff();
}   
}
公共类框架{
公共静态void main(字符串[]args)引发异常{
FrameworkFactory.doStuff(FrameworkObject.class);
}
}

非常好,我将尝试选项1并发布结果。谢谢你的建议:)嗯,我实际上想暂时和“第一校长”一起去,但是谢谢你的回答。我已经按照ajwillia的建议进行了更改,但我不能再发布8小时;)