我尝试使用注解来注册功能的设置,但无法反映设置字段,我做错了什么
这是功能初始化,我要添加设置
public Feature() {
try {
Class<SettingAnno> anno = SettingAnno.class;
for (Field field : this.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(anno)) {
Setting setting = (Setting) field.get(this);
this.settings.add(setting);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
但是当我使用Setting setting = (Setting) field.get(this);
时,它实际上将被设置为'null'
特征子项:
public final class FeatureChild extends Feature {
@SettingAnno("setting1")
public final BooleanSetting setting1 = new BooleanSetting(true);
}
BoolenSetting是设置子级
这是注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SettingAnno {
String value();
}
1条答案
按热度按时间rjee0c151#
子类字段初始化器在超类构造函数之后运行,所以这是意料之中的。
当
Feature
构造函数运行时,带注解的字段还没有初始化,所以它们都是空的。一个简单的解决方法是要求子类在它们自己的构造函数中调用类似
registerSettings
的东西,此时,所有子类的字段都将被初始化。