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

8zzbczxx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(389)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

7年前关门了。
改进这个问题
我在自学如何创建可以在外部重写的类,基本上是为了模拟一个只为接口提供实现的框架。我注意到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
    }
}
pexxcrt2

pexxcrt21#

如果您正在寻找一种内置机制,那么定制服务提供商可能是您的答案(自Java1.6以来就有了)。

mrzz3bfm

mrzz3bfm2#

这是我解决问题的快速方法,然后它需要任何可以转换到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);
}
}
ve7v8dk2

ve7v8dk23#

在所有框架中,都需要一个配置Map或组件注入的入口点。在您的示例中,这是frameworkdriver。不可能简单地扫描实现并动态加载它们。我建议两种可能的解决办法之一。
1) 向frameworkdriver添加一个方法,该方法创建在创建框架时使用的frameworkobject(扩展类将需要重写main,否则它将创建原始类的示例并错过此扩展)。这使得frameworkdriver的其他实现可以覆盖它并提供另一种实现。
2) 驱动程序读取一个系统属性或文件,其中包含对象或其工厂的类名,因此您不再需要对其进行编码。许多依赖注入框架都使用了这种方法,有些框架通过从构建插件或其他源处理器生成文件来自动处理这种方法。
一般来说,使用guice这样的现成系统可能会更好。

相关问题