正在配置要与Framework一起使用的接口



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

我试图实现的是Togglez所做的:

public class MyTogglzConfiguration implements TogglzConfig {
    public Class<? extends Feature> getFeatureClass() {
        return MyFeatures.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<? extends FrameworkConfig> clazz = configurations.iterator().next();
FrameworkConfig myInstance = clazz.newInstance();

之后,您可以像往常一样调用方法:

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

之后,你可以用这些信息做任何你想做的事。但我假设,您也将创建该类的一个新实例:

Feature myFeature = featureClass.newInstance();

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

myFeature.foo();

所有这些代码都假设bot类FrameworkConfigFeature有一个默认构造函数——一个没有参数的公共构造函数。

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

实现者在中"注册"他/她的实现的完全限定类名

META-INF/services/package.to.YourInterface

然后可以通过以下方式加载实现:

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

相关内容

  • 没有找到相关文章

最新更新