循环遍历Java类中的所有字段

时间:2013-06-13 19:40:25

标签: java class field

我有一个Java类,其数量为Fields

我想循环遍历alhehe字段并为null的那些做一些事情。

例如,如果我的班级是:

public class ClassWithStuff {
    public int inty;
    public stringy;         
    public Stuff;
    //many more fields
}

在另一个位置,我会创建一个ClassWithStuff对象,我想通过课程中的所有字段。有点像这样:

for (int i = 0; i < ClassWithStuff.getFields().size(); i++) {
      //do stuff with each one
}

我有什么方法可以实现这个目标吗?

4 个答案:

答案 0 :(得分:19)

在[班级]

上使用getDeclaredFields
ClasWithStuff myStuff = new ClassWithStuff();
Field[] fields = myStuff.getClass().getDeclaredFields();
for(Field f : fields){
   Class t = f.getType();
   Object v = f.get(myStuff);
   if(t == boolean.class && Boolean.FALSE.equals(v)) 
     // found default value
   else if(t.isPrimitive() && ((Number) v).doubleValue() == 0)
     // found default value
   else if(!t.isPrimitive() && v == null)
     // found default value
}

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

答案 1 :(得分:8)

是的,有了反思。

使用Class对象使用getFields()方法访问Field个对象。

Field[] fields = ClassWithStuff.class.getFields();

然后遍历字段。这是有效的,因为您声明的所有字段都是public。如果不是,请使用getDeclaredFields(),它会访问在课程中直接声明的所有Fieldspublic

答案 2 :(得分:2)

正在寻找的是reflection。通过反射,您可以查看自己的类或其他类,以查看它的组成。 Java内置了反射功能,因此您可以立即使用它。然后你可以做像 -

这样的事情
for(Field f : ClasWithStuff.getFields()){
    System.out.println(f.getName());//or do other stuff with it
}

您也可以使用它来获取方法,构造函数等,以执行类似和更酷的操作。

答案 3 :(得分:0)

使用库durianStream的Java 8+解决方案。

实用程序方法FieldsAndGetters.fields(Object obj)

  

返回所有公共字段及其给定值的流   对象。

这将找到ClassWithStuff的字段,因为它们都是公共的。

让我们看看如何将其与ClassWithStuff(稍作修改)一起使用:

public static class BaseStuff {
    public DayOfWeek dayOfWeek = DayOfWeek.MONDAY;
}

public static class ClassWithStuff extends BaseStuff {
    public int inty = 1;
    public String stringy = "string";
    public Object Stuff = null;
}

示例-打印每个字段的名称和值:

public static void main(String[] args) throws Exception {
    ClassWithStuff cws = new ClassWithStuff();
    FieldsAndGetters.fields(cws) 
            .map(field -> field.getKey().getName() + " = " + field.getValue())
            .forEach(System.out::println);
}

输出:

inty = 1
stringy = string
Stuff = null
dayOfWeek = MONDAY

正如ouptut所示,甚至会考虑继承的公共字段。