语境
我想使用 Guice 自动注入配置项。我的配置框架是 typesafe 的配置。
public class MyObject {
@Configuration("value") int value;
}
为此,我写了一个注释。
// Annotations skipped, but correct
public @interface Configuration {
String value();
}
我写了一个模块。这个模块检查所有类型的注入,然后允许注入本身。
public class ConfigurationModule extends AbstractModule {
@Override protected void configure() {
final Config config = ConfigFactory.load();
class ConfigurationMembersInjector<T> implements MembersInjector<T> {
private final Field field;
ConfigurationMembersInjector(Field field) {
this.field = field;
field.setAccessible(true);
}
@Override public void injectMembers(T t) {
try {
String key = field.getAnnotation(Configuration.class).value();
field.set(t, config.getXxxx()); // what to write?
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
class ConfigurationTypeListener implements TypeListener {
@Override public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {
for (Field field : typeLiteral.getRawType().getDeclaredFields()) {
if (field.isAnnotationPresent(Configuration.class)) {
typeEncounter.register(new ConfigurationMembersInjector<T>(field));
}
}
}
}
bindListener(Matchers.any(), new ConfigurationTypeListener());
}
}
问题
如何自动将配置项转换为特定但未知的类型?有没有办法说“我希望将此项目转换为这种类型”?另外,有没有办法“注册”自定义转换器?
否则,我是否必须编写自己的转换机制?