2011-10-25 24 views
2

不知道如果我能做到這一點,但是,說我有對象:如何確定有多少個字段一個對象被設置在Java中

public class SomeObject 
{ 
    private String field1; 
    private String field2; 
    .... 

    //Blah Blah getters and setters for all fields 
} 

我想要得到多少,這些領域的計數非空。我的特殊對象有40個字段,所以我真的不想有一個if塊來單獨檢查每個40個字段。我想我可以用反射來做到這一點?但真的不知道我在做什麼。只需遍歷所有字段並檢查它們的值就可以了。

我覺得這對於那裏的人來說是不容小覷的。

+2

你*可以*使用反射來解決這個問題。但是*應該*你? –

回答

5

是的,你可以反射做到這一點:

SomeObject objectReference = ...; // The object you're interested in 
Class clazz = SomeObject.class; 
int nullCount = 0; 
for (Field field : clazz.getDeclaredFields()) 
{ 
    field.setAccessible(true); 
    if (field.get(objectReference) == null) 
    { 
     nullCount++; 
    } 
} 

(受各種例外,權限等)

這感覺就像一個黑客位的,雖然......這是一個有點奇怪的要求,說實話。你肯定需要全部40個字段,並且你是否需要將它們分成單獨的字段而不是(比如說)數組?

+0

不'field.getValue()'拋出一個nullpointerexception? –

+0

是的,你可以,[但你不必](http://www.reellifewisdom.com/let_us_redefine_progress_to_mean_that_just_because_we_can_do_a_thing_it_does_not_necess_a_thing_it_does_not_necessarily_mean_we_must_do_that_t)。 – cwallenpoole

+0

@ Eng.Fouad:如果'objectReference'不爲null,那麼不行......爲什麼呢?它只是獲取該對象內的字段的值。如果該值爲空,它將返回空... –

0
  1. 爲什麼這個對象有40個字段?

  2. 你可以在沒有使用反射的計數類上編寫另一種方法。

  3. 使用反射遍歷字段 - 糟糕的選擇。

0

這不是直接回答你的問題,你可以通過數據成員反射訪問打破它,但其中一個方案是有一個計數器數據成員。這樣

public class SomeObject{ 
    private int numNull = {number of fields}; 
    private String someString; 
    ... 

    public void setSomeString(String string){ 
     --numNull; 
     someString = string; 
    } 
} 

東西然後,你可以閱讀numNull屬性來獲取字段的數量,而無需通過使用反射的開銷會(反思是真的,真的昂貴)。就像我說的那樣,錯誤的代碼可以很容易地修改這些參數並繞過setter函數,這會讓你的內部計數無效,所以我不會依賴它。

1

沒問題,你可以使用反射。

SomeObject obj = new SomeObject(); 
//initialization 
//................... 

// now the code that prints all null fields 
Field[] fields = SomeObject.class.getDeclaredFields(); 
for (Field field : fields) { 
    field.setAccessible(true); 
    if (field.getValue(obj) == null) { 
     System.out.println(field.getName()); 
    } 
} 

很顯然,你應該把這樣的代碼可重複使用的方法:你可以決定的方法是:在類中,抽象基類或實用工具。這取決於你的項目。

相關問題