java 字段.get()返回'null'

qlckcl4x  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(405)

我尝试使用注解来注册功能的设置,但无法反映设置字段,我做错了什么
这是功能初始化,我要添加设置

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();
}
rjee0c15

rjee0c151#

子类字段初始化器在超类构造函数之后运行,所以这是意料之中的。
Feature构造函数运行时,带注解的字段还没有初始化,所以它们都是空的。
一个简单的解决方法是要求子类在它们自己的构造函数中调用类似registerSettings的东西,此时,所有子类的字段都将被初始化。

// in Feature...
public final void registerSettings() {
    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();
    }
}
// in FeatureChild...

public FeatureChild() {
    registerSettings();
    // ...
}

相关问题