1

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

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

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

4

4 回答 4

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;
     }

请注意:这不包括继承的字段(如果有)。

于 2012-10-25T01:05:20.530 回答
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;
}
于 2012-10-25T01:17:53.413 回答
1
public boolean checkZero(Class T){

不正确

[检查] Java 对象是否包含...

你需要的是

public boolean checkZero(Object o){

现在你有一个Object

  • 用于Object.getclass获取其Class
  • 用于Class.getFields获取其字段
  • 用于Field.getType获取字段的类
  • 检查字段的类是否为 Numeric
  • 用户setAccessible能够访问潜在的私有字段。在某些情况下这可能会失败,请查看文档。
  • 用于Field.get获取该字段的值
  • 将其转换为正确的静态类型并与 0 进行比较。
于 2012-10-25T01:12:22.033 回答
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;
}

唯一可能的问题是比较对象形式的原始字段。您可能需要使用 Field#getInt、Field#getDouble 等来创建特殊情况,以检查值是否为零。

于 2012-10-25T01:14:10.450 回答