[英]Java how can I with reflection check if a field is initialized or is default value?
[英]How to check if a field was initialized or contains the default value in Java
我正在使用jackson mapper將json字符串映射到一個類。 這個類看起來像這樣:
class MyClass{
@JsonProperty("my_boolean")
private boolean myBoolean;
@JsonProperty("my_int")
private int myInt;
//Getters and setters
}
我想檢查字段myBoolean和myInt是否實際設置或包含其默認值(false和0)。 我嘗試使用反射並檢查字段是否為空,但我想這對原始類型不起作用。 這就是我現在擁有的:
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.