如何遍历Java bean的所有属性

时间:2015-06-05 08:14:26

标签: java reflection javabeans

下面是我的bean结构。 Employee.java是父bean。我想迭代所有属性,直到Zip.java并操纵值。

我尝试使用反射迭代它,但getDeclaredFields()将仅提供顶级对象的字段。如何迭代更深层的对象。

有人可以让我知道如何在java中执行此操作。

Employee.java

private String id;
private String name;
private int age;
private Address addr;
private Contact cont;

Address.java

private String addr1;
private String addr2;
private String city;
private Zip zip;

Contact.java

private String phone;
private String email;

Zip.java

private String zipCd;
private String zipExt;

5 个答案:

答案 0 :(得分:1)

getDeclaredFields()

for (Field field : yourObject.getClass().getDeclaredFields()) {
//do stuff
}

答案 1 :(得分:1)

我强烈建议使用现有的库并避免在这种情况下反射!使用JPA或Hibernate进行数据库使用,使用JAXB或类似的JSON / XML /其他序列化等。

但是,如果您想查看示例代码的样子,可以查看一下:

package myOwnPackage;
import java.lang.reflect.Field;


class Address {
    private String addr1;
    private String addr2;
    private String city;
    private Zip zip;
}
class Contact {
    private String phone;
    private String email;
}
class Employee {
    private String id;
    private String name;
    private int age;
    private Address addr;
    private Contact cont;

    public void setAddr(Address addr) {
        this.addr = addr;
    }
}

class Zip {
    private String zipCd;
    private String zipExt;
}

public class Main {

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {

        Employee employee = new Employee();
        employee.setAddr(new Address());

        printFields("", employee);
    }

    private static void printFields(String prefix, Object container) throws IllegalAccessException {

        Class<? extends Object> class1 = null; 
        Package package1 = null;

        if (container != null)
            class1 = container.getClass();

        if (class1 != null)
            package1 = class1.getPackage();

        if (package1 == null || !"myOwnPackage".equals(package1.getName())) {
            System.out.println(container);
            return;
        }

        for (Field field : class1.getDeclaredFields()) {
            System.out.print(prefix+field.getName()+": ");

            // make private fields accessible
            field.setAccessible(true);

            Object value = field.get(container);
            printFields(prefix+"  ", value);
        }
    }
}

我的代码的缺点:

  • 此代码使用反射,因此您在字段深度处受限
  • 不打印继承的字段

答案 2 :(得分:0)

您可以像这样使用java反射 -

for (Field f : Employee.class.getClass().getDeclaredFields()) {

  } 

答案 3 :(得分:0)

您可以尝试以下

首先让你的POJO在内部类中,并为每个POJO类型设置一个arraylist

Public class ModelPojo{

private ArrayList<Employee > employeeList;
private ArrayList<Address> employeeList;
private ArrayList<Zip> employeeList;
private ArrayList<Contact> employeeList;
class Employee {}
class Address{}
class Contact{}
class Zip{}

}

他们可以改变你的价值观

public class Logic {
someMethod{
ModelPojo.Employee employee ;
        ArrayList<Employee > empList = new ArrayList<Employee >();
        for(int i=0;i<empList .size();i++){
            employee = new ModelPojo(). new Employee ();
            employee .set***("");
            employee .set***("");


            empList .add(product);
        }
}
}

希望这个帮助

答案 4 :(得分:0)

我这样做了,但我知道并且我强烈认为这被认为是错误的编程。 我这样做是因为有人强迫我这样做! (我认为,最好的解决方案是编写更多代码......这是最快的。)

public String getNestedDeclaredField(Object obj, String fieldName) {
    if (null == fieldName) {
        return null;
    }
    String[] fieldNames = fieldName.split("\\.");
    Field field = null;
    Class<? extends Object> requestClass = obj.getClass();

    for (String s : fieldNames) {
        try
        {
            field = getSuperClassField(requestClass,
                    requestClass.getSimpleName(), s);
            field.setAccessible(true);
            obj = field.get(obj);

            if (null == obj) {
               return null;
            }
            requestClass = obj.getClass();
        }

        catch (Exception e) {
            log.error("Error while retrieving field {} from {}", s,
                    requestClass.toString(), e);
            return "";
        }
    }

    return obj.toString();
}

public Field getSuperClassField(Class<? extends Object> clazz,
        String clazzName, String fieldName) throws NoSuchFieldException {
    Field field = null;

    try{
        field = clazz.getDeclaredField(fieldName);
    }

    catch (NoSuchFieldException e) {
        clazz = clazz.getSuperclass();

        if (StringUtils.equals(clazz.getSimpleName(), "Object")) {
            log.error("Field {} doesn't seem to appear in class {}",
                    fieldName, clazzName);
            throw new NoSuchFieldException();
        }
        field = getSuperClassField(clazz, clazzName, fieldName);
    }

    catch (Exception e) {
        log.error("Error while retrieving field {} from {}", fieldName,
                clazz.toString(), e);
    }

    return field;
}

其中fieldName是(对于zipCd):addr.zip.zipCd

它将从Employee对象中检索zipCd的String值。