Java 如何通过反射检查字段是否已初始化或是否为默认值?
2022-09-04 05:26:25
所以,应该是直截了当的问题。
假设我有一个类,有很多字段,例如:
String thizz;
long that;
boolean bar;
通过反射,我如何查看字段是否已被初始化或保留为默认值null,0和false?thizz
that
bar
所以,应该是直截了当的问题。
假设我有一个类,有很多字段,例如:
String thizz;
long that;
boolean bar;
通过反射,我如何查看字段是否已被初始化或保留为默认值null,0和false?thizz
that
bar
您只有 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
}
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