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

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

public class SomeObject { private String field1; private String field2; .... //Blah Blah getters and setters for all fields } 

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

我觉得这对那里的某个人来说并不是一件容易的事。

是的,你可以用reflection做到这一点:

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

没问题,你可以使用reflection。

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

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

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

 public class SomeObject{ private int numNull = {number of fields}; private String someString; ... public void setSomeString(String string){ --numNull; someString = string; } } 

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