不确定我是否可以这样做但是,我说有这个对象:
public class SomeObject
{
private String field1;
private String field2;
....
//Blah Blah getters and setters for all fields
}
我想知道这些字段中有多少是非空的。我的特定对象有40个字段,所以我真的不想让if块分别检查40个字段中的每个字段。我以为我能以某种方式用反射做到这一点?但真的不知道我在做什么。只需遍历所有字段并检查其值即可。
我觉得这对那里的人来说毫无疑问。
答案 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函数,这会使你的内部计数无效,所以我不会依赖它。