我目前正在开发一个框架,在该框架中,我将提供一个接口,用户应在其应用程序中实现该接口以进行配置。用户应该能够实现将在框架端使用的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类FrameworkConfig
和Feature
有一个默认构造函数——一个没有参数的公共构造函数。
实现它的一种简单方法是使用java.util.ServiceLoader.
实现者在中"注册"他/她的实现的完全限定类名
META-INF/services/package.to.YourInterface
然后可以通过以下方式加载实现:
ServiceLoader.load(YourInterface.class).iterator().next().getTargetUsername();