如果Java对象包含设置为值0
的数字字段,我如何发现(可能使用反射)?我在想这样的事情:
public boolean checkZero(Class T){
return false;
// need help here
}
但是T
没有检查值的方法。
答案 0 :(得分:3)
我认为你可以这样做:
public boolean checkZero(Class clazz){
boolean zeroNumericFields = true;
Field[] fields = clazz.getDeclaredFields();
boolean zeroNumericFields = true;
List<Class> numberClasses = new ArrayList<Class>();
//Add all types you want to check e.g.
numberClasses.add(Number.class);
numberClasses.add(Integer.class);
numberClasses.add(Long.class);
numberClasses.add(Double.class);
numberClasses.add(Float.class);
if(fields.length > 0){
for(Field field : fields){
if(numberClasses.contains(field.getType())){
zeroNumericFields = false;
break;
}
}
}
return zeroNumericFields;
}
请注意:这不包括继承的字段(如果有的话)。
答案 1 :(得分:2)
不确定它是否是你想要的但是试试吧:)
static boolean checkZeroes(Object o) throws IllegalArgumentException,
IllegalAccessException {
Field[] fields = o.getClass().getDeclaredFields();
for (Field f : fields) {
// lets check what is inside of field
f.setAccessible(true);// in case of private field
Object value = f.get(o);
System.out.println("checking " + f + ": " + value);
if (value.equals((byte) 0)
|| value.equals((short) 0)
|| value.equals((int) 0)
|| value.equals((long) 0)
|| value.equals((float) 0)
|| value.equals((double) 0)
){
return true;
}
}
return false;
}
答案 2 :(得分:1)
public boolean checkZero(Class T){
不正确
[检查] Java对象是否包含...
您需要的是
public boolean checkZero(Object o){
现在你有一个Object
,
Object.getclass
获取其Class
Class.getFields
获取其字段Field.getType
获取字段的类setAccessible
,以便能够访问潜在的私有字段。在某些情况下,这可能会失败,请查看文档。Field.get
获取该字段的值答案 3 :(得分:1)
您可以遍历类的声明字段并获取其值。但是,您还需要从该类获取值的实例。
public static boolean checkZero(Object toCheck) {
final Class<?> numerics = new Class<?>[]{ int.class, double.class, float.class,
long.class, short.class, byte.class, Integer.class, Double.class,
Float.class, Long.class, Short.class, Byte.class };
try {
Class<?> clazz = toCheck.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Class<?> type = field.getType();
boolean isNumeric = false;
for (Class<?> numeric : numerics) {
if (type.equals(numeric)) {
isNumeric = true;
break;
}
}
if (isNumeric) {
Object value = field.get(toCheck);
if (value == 0) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
唯一可能的问题是比较Object表单中的原始字段。您可能需要使用Field#getInt,Field#getDouble等来创建特殊情况,以便将值检查为零。