2015-06-05 113 views
4

下面是我的bean结构。 Employee.java是父级bean。我想遍历所有的属性,直到Zip.java并操纵值。如何遍历Java bean的所有属性

我试着迭代这个使用反射,但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; 
+1

执行setters,然后您将能够设置值。 –

+0

我想使用反射来迭代这种类型的任何Java bean并修改其值。 – Girish

+0

你做这种事情的用例是什么?你是否正在从数据库中读取和读取数据?然后考虑使用JPA或Hibernate。你是序列化还是去序列化JSON/XML /其他格式?然后考虑JAXB或类似的。 – slartidan

回答

1

getDeclaredFields()

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

我尝试使用反射来迭代,但getDeclaredFields()只会给出顶级对象的字段。如何遍历更深的对象。 – Girish

+0

你会做同样的事情,但它可能不是一个好主意依靠反射如此之多 – NimChimpsky

+0

除反射之外是否有其他选择? – Girish

0

您可以使用Java反射这样的 -

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

    } 
+0

我试图用反射来迭代这个,但getDeclaredFields()只会给出顶级对象的字段。如何遍历更深的对象。 – Girish

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

缺点:

  • 该代码使用反射,所以你在
  • 继承的字段不打印
  • 领域的深度限制
0

你可以试试这个下面

先听听你的POJO的一个内部类,并为每个POJO类

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{} 

} 

一个ArrayList他们你可以改变以下方式你的价值观

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

希望这个帮助

+0

这种正常方式之间没有反射类型 – Thomas

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的字符串值。