如何在Java中检查字段是否已初始化或包含默认值



我正在使用jackson映射器将json字符串映射到一个类。类看起来是这样的:

class MyClass{      
    @JsonProperty("my_boolean")
    private boolean myBoolean;
    @JsonProperty("my_int")
    private int myInt;
    //Getters and setters
}

我想检查字段myBoolean和myInt是否真的被设置或包含它们的默认值(false和0)。我尝试使用反射并检查字段是否为null,但我想这对基元类型不起作用。这就是我现在拥有的:

Field[] fields = myClass.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {            
                field.setAccessible(true);
                Object myObject = field.get(myClass);
                if(myObject != null) {
                  //Thought this would work, but it doesn't
                }
            }
         }

我还能怎么查?

谢谢。

您应该检查字段类型是否为基元,如果是基元,则根据默认包装器检查值。例如:

Map<Class, Object> defaultValues = new HashMap<Class, Object>();
defaultValues.put(Integer.class, Integer.valueOf(0)); 
// etc - include all primitive types

然后:

Object value = field.get(myClass);
if (value == null ||
    (field.getType().isPrimitive() && value.equals(defaultValues.get(field.getType())) {
   // Field has its default value
} 

这不会判断字段是否已设置,只会判断其当前值是否为该类型的默认值。您无法区分值为0的字段(因为它是以这种方式显式设置的)和根本没有显式分配的字段。

您还可以使用具有默认值的对象,而不是基元类型;即

class MyClass{      
    @JsonProperty("my_boolean")
    private Boolean myBoolean = BOOLEAN_DEFAULT; // get it from a map
    @JsonProperty("my_int")
    private Integer myInt = INT_DEFAULT;  // get it from a map
    //Getters and setters
}

然后

if (myClass.getMyInt() == null) {
  // The value is explicitly set to null
} else if (defaultValuesMap.get(Integer.class).equals(myClass.getMyInt())) {
  // The value has its default value
} else {
  // etc
}

相关内容

  • 没有找到相关文章

最新更新