2012-10-25 26 views
1

如果Java對象包含設置爲值0的數值字段,我該如何發現(可能使用反射)?我想是這樣的:如何發現對象是否包含設置爲0的數字字段?

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

然而T不具有將檢查值的方法。

+0

這不是我清楚你以後。你能澄清嗎?一個班級「包含0值」意味着什麼? –

+0

您的問題的第一個版本更好。 –

+0

嗨邁克爾。我想我的方法來檢查一些類是否包含0值的參數。可能嗎? – Takarakaka

回答

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

-1。你只是檢查該類*是否有*字段。 – Vulcan

+0

優秀的代碼,現在會測試它! :) – Takarakaka

+0

@Vulcan:我添加了檢查類型的邏輯。 –

1
public boolean checkZero(Class T){ 

是不正確的

[檢查]如果一個Java對象包含...

你需要的是

public boolean checkZero(Object o){ 

現在你有一個Object

  • 使用Object.getclass以獲取其Class
  • 使用Class.getFields獲得其字段
  • 使用Field.getType獲取字段的類
  • 檢查該字段的類是數字
  • 用戶setAccessible能夠訪問潛在的私人領域。在某些情況下,這可能會失敗,請檢查文檔。
  • 使用Field.get得到的那場
  • 投它正確的靜態類型的價值,並比較0
+0

優秀的答案!如果我可以通過使用它來完成我想要做的事情,現在將檢查它。 :) – Takarakaka

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等等來檢查值爲零的特殊情況。

+0

偉大的代碼和偉大的答案,@Vulcan! :) – Takarakaka

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

但是,如果我將我的私人字段設置爲可訪問,那麼會以任何方式損害我的安全性嗎? – Takarakaka

+0

這就是我不確定這個解決方案是否是你想要的原因之一。你不必使用'f.setAccessible(true)'如果你不想:) – Pshemo

+0

@Takarakaka'f.setAccessible(true)'永遠不會改變字段的可訪問性,只是讓'f'引用得到來自對象的該字段的值。 – Pshemo

相關問題