2015-06-05 144 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的字符串值。