如何判断对象是否包含设置为0的数字字段?

时间:2012-10-25 00:49:48

标签: java

如果Java对象包含设置为值0的数字字段,我如何发现(可能使用反射)?我在想这样的事情:

public boolean checkZero(Class T){
   return false; 
   // need help here 
}

但是T没有检查值的方法。

4 个答案:

答案 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获取该字段的值
  • 将其转换为正确的静态类型并与0进行比较。

答案 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等来创建特殊情况,以便将值检查为零。