Java 如何通过反射检查字段是否已初始化或是否为默认值?

2022-09-04 05:26:25

所以,应该是直截了当的问题。

假设我有一个类,有很多字段,例如:

String thizz;
long that;
boolean bar;

通过反射,我如何查看字段是否已被初始化或保留为默认值null,0和false?thizzthatbar


答案 1

您只有 7 个基元类型和一个引用类型需要检查。如果将所有数字类型组合在一起,则只有四个值需要检查。

Object o =
for (Field field : o.getClass().getDeclaredFields()) {
 Class t = field.getType();
 Object v = field.get(o);
 if(t == boolean.class && Boolean.FALSE.equals(v)) 
   // found default value
 else if(t == char.class && ((Character) v).charValue() == 0)
   // found default value
 else if(t.isPrimitive() && ((Number) v).doubleValue() == 0)
   // found default value
 else if(v == null)
   // found default value
}  

答案 2

Peter Lawrey的答案对我来说很好,除了原始数据类型的字段,这在我的代码中引发了以下异常:char

java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Number

所以我添加了案例:char

Object o =
for (Field field : o.getClass().getDeclaredFields()) {
 Class t = field.getType();
 Object v = field.get(o);
 if (boolean.class.equals(t) && Boolean.FALSE.equals(v)) 
   // found default value
 else if (char.class.equals(t) && ((Character) v) != Character.MIN_VALUE)
   // found default value
 else if (t.isPrimitive() && ((Number) v).doubleValue() == 0)
   // found default value
 else if(!t.isPrimitive() && v == null)
   // found default value
}  

Character.MIN_VALUE是 ,这是根据 Java 文档关于基元数据类型的默认值。'\u0000'char