如何确定在Java中对象上设置的字段数

时间:2011-10-25 17:59:18

标签: java

不确定我是否可以这样做但是,我说有这个对象:

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

    //Blah Blah getters and setters for all fields
}

我想知道这些字段中有多少是非空的。我的特定对象有40个字段,所以我真的不想让if块分别检查40个字段中的每个字段。我以为我能以某种方式用反射做到这一点?但真的不知道我在做什么。只需遍历所有字段并检查其值即可。

我觉得这对那里的人来说毫无疑问。

3 个答案:

答案 0 :(得分:6)

是的,你可以用反射来做:

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个字段,你是否需要将它们作为单独的字段而不是(比如说)数组?

答案 1 :(得分: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());
    }
}

显然你应该把这样的代码放到可重用的方法中:你可以决定方法的位置:在类本身,抽象基类或实用程序中。这取决于您的项目。

答案 2 :(得分:0)

这不是您问题的直接答案,而您可能通过反对访问数据成员来破解它,但一种选择是拥有一个计数器数据成员。像这样的东西

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

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

然后,您可以读取numNull属性以获取字段数,而无需经历使用反射的开销(反射确实是,真的昂贵)。就像我说的那样,糟糕的代码可以很容易地修改这些参数并绕过setter函数,这会使你的内部计数无效,所以我不会依赖它。