“java中的字段”;“不是原始字段”;错误

“java中的字段”;“不是原始字段”;错误,java,field,Java,Field,我一直在使用字段将类解析为SharedReferences。它在设置类不是单例时工作。我换成了单身汉,现在不再工作了 G2ASettings settings = G2ASettings.getInstance(); Field[] fields = G2ASettings.class.getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); try {

我一直在使用字段将类解析为SharedReferences。它在设置类不是单例时工作。我换成了单身汉,现在不再工作了

G2ASettings settings = G2ASettings.getInstance();
    Field[] fields = G2ASettings.class.getDeclaredFields();
    for (Field f : fields) {
        f.setAccessible(true);
        try {
            if (preferences.contains(f.getName()) && !f.getName().equals("INSTANCE")) {
                f.set(settings, preferences.getBoolean(f.getName(), f.getBoolean(settings))); //si no lo encuentra, pone el valor por defecto determinado en la clase
            } else {
                if (blablabla) {
                    editor.putBoolean(f.getName(), true);
                    allPreferencesDisabled = true;
                } else
   (*)----->        editor.putBoolean(f.getName(), f.getBoolean(settings)); 
            }
   (*)----->  if (!allPreferencesDisabled) allPreferencesDisabled = f.getBoolean(settings);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
报告的错误如下:

Caused by: java.lang.IllegalArgumentException: not a primitive field
在代码中标记为(*)的行中报告错误

G2ASettings的字段均为public和boolean,但实例变量除外,实例变量为G2ASettings类型变量且为private

我将在这里报告我的进展

额外:我在此仅发布G2A设置类(通常的单例类)的相关数据:


当它抛出此异常时,您所在的字段是哪个?我敢打赌这是一个实例,正如你所说,它不是布尔值,所以你不能对它调用
getBoolean()


在尝试获取当前字段的布尔值之前,检查当前字段是否不是实例的if语句需要更早,并涵盖所有其他逻辑,因为实例永远不会有布尔值,也不应该被持久化。

如果您发布一个简短但完整的程序来演示该问题,这将非常有帮助。这里有很多不太可能相关的内容,但如果我们能够自己复制它,这将非常有用。editor.putBoolean做什么?当它抛出此异常时,您在哪个字段上?我敢打赌这是一个实例,正如你所说,它不是布尔值,所以你不能对它调用
getBoolean()
。在尝试获取当前字段的布尔值之前,检查当前字段是否不是实例的if语句需要更早,并涵盖所有其他逻辑,因为实例永远不会有布尔值,也不应该被持久化。@Leo,我发布的函数检查SharedReferences是否有所有必需的字段(这些是G2ASettings类的字段)。如果缺少字段,它会添加字段及其值(使用editor.putBoolean)。您好Tim,正如我所说,我知道问题与实例变量有关。看起来像“If(preferences.contains(f.getName())&!f.getName().equals(“实例”)”语句不起作用,因为它在第一个(*)处仍然崩溃。不过,如果我用“String field=f.getName();if(!field.equals(“实例”){(blablab}”覆盖整个“try”部分”这很有效…愚蠢的我jeje。我现在问这个问题感到很愚蠢。我能做些什么来删除这个?我认为不值得把这个问题放在stackoverflow中。干杯
public class G2ASettings implements Serializable {

public boolean {big amount of boolean variables]

private static G2ASettings INSTANCE = null;
private synchronized static void createInstance() {
    if (INSTANCE == null) {
        INSTANCE = new G2ASettings();
    }
}

public static G2ASettings getInstance() {
    if (INSTANCE == null) createInstance();
    return INSTANCE;
}

{public getters and setters}
}