1

我目前正在开发一个框架,我将在其中提供一个接口,用户应在其应用程序中实现该接口以用于配置目的。用户应该能够实现一个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];

我能够使用上面的代码获得正确的类,但我实际上不能调用getTargetUsername().

4

2 回答 2

2

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

实现者“注册”他/她的实现的完全限定类名:

META-INF/services/package.to.YourInterface

然后,您可以通过这种方式加载实现:

ServiceLoader.load(YourInterface.class).iterator().next().getTargetUsername();
于 2016-07-22T13:51:15.820 回答
2

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

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

之后,您可以照常调用该方法:

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

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

Feature myFeature = featureClass.newInstance();

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

myFeature.foo();

所有这些代码都假定机器人类FrameworkConfigFeature具有默认构造函数 - 一个没有参数的公共构造函数。

于 2016-07-22T13:46:39.413 回答