配置接口以与框架一起使用

Configurating Interface to use with Framework

我目前正在开发一个框架,我将在其中提供一个界面,用户应该在其应用程序中实现该界面以进行配置。用户应该能够实现将在框架端使用的 getTargetUsername()

我想要实现的几乎就是 Togglez 所做的:

public class MyTogglzConfiguration implements TogglzConfig {

    public Class<? extends Feature> getFeatureClass() {
        return MyFeatures.class;
    }

}

我的问题是我正在努力寻找如何查找正在实现我的配置界面的 class。并在框架内调用getTargetUsername()方法。


到目前为止我尝试过的:

我目前正在尝试使用 Reflections 来解决这个问题,但我不确定这是不是正确的方法,因为我不知道这是否只在我的框架包中查找或者它将在项目中搜索并将其添加为依赖项。

Reflections reflections = new Reflections();
Set<Class<? extends FrameworkConfig>> configurations = reflections.getSubTypesOf(FrameworkConfig.class);

//Getting the Class thats is implementing here
Object c = configurations.toArray()[0];

我可以用上面的代码得到正确的 Class 但我实际上不能调用 getTargetUsername().

如果您的 configurations 集已经包含所有相关的 class 元素,那么第一步是创建该 class 的新实例。

Class<? extends FrameworkConfig> clazz = configurations.iterator().next();
FrameworkConfig myInstance = clazz.newInstance();

之后就可以正常调用方法了:

Class<? extends Feature> featureClass = myInstance.getFeatureClass();

在那之后,你可以用这些信息做任何你想做的事。但我假设,您还将创建 class 的新实例:

Feature myFeature = featureClass.newInstance();

现在您可以与该实例进行交互了:

myFeature.foo();

所有这些代码都假设 bot classes FrameworkConfigFeature 有一个默认构造函数 - 一个没有参数的 public 构造函数。

实现它的一个简单方法是使用 java.util.ServiceLoader

实施者 "register" his/her 实施的完全限定 class 名称:

META-INF/services/package.to.YourInterface

然后您可以这样加载实现:

ServiceLoader.load(YourInterface.class).iterator().next().getTargetUsername();