2011-10-25 25 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()); 
    } 
} 

很显然,你应该把这样的代码可重复使用的方法:你可以决定的方法是:在类中,抽象基类或实用工具。这取决于你的项目。

相关问题