2017-08-14 57 views
0

我有一個POJO對象和一組適當的數據。遍歷對象設置器java

import java.util.ArrayList; 
import java.util.List; 

public class TestPojo { 

private String name; 
private String number; 
private String id; 
private String sex; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getNumber() { 
    return number; 
} 

public void setNumber(String number) { 
    this.number = number; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getSex() { 
    return sex; 
} 

public void setSex(String sex) { 
    this.sex = sex; 
} 

public static void main(String[] args) { 

    TestPojo test = new TestPojo(); 

    List<String> sampleData = new ArrayList<>(); 
    sampleData.add("Bob"); 
    sampleData.add("641-613-623"); 
    sampleData.add("id-1451"); 
    sampleData.add("Male"); 

    test.setName(sampleData.get(0)); 
    test.setNumber(sampleData.get(1)); 
    test.setId(sampleData.get(2)); 
    test.setSex(sampleData.get(3)); 
    } 
} 

我的問題是我怎麼能填滿我的POJO對象在一個循環的數據?迭代所有對象設置器並在適當位置設置List中的數據是否可行?我知道在這種情況下反射可以有所幫助。

回答

2

下面是一個簡單例如調用經由反射setter方法(需要被調整的):

[如果這是一個很好的方法,則是另一個問題。但是,爲了回答你的問題:]

public static void main(String[] args) throws Exception 
{ 
    //this is only to demonstrate java reflection: 
    Method[] publicMethods = TestPojo.class.getMethods(); //get all public methods 
    TestPojo testObj = TestPojo.class.newInstance(); //when you have a default ctor (otherwise get constructors here) 
    for (Method aMethod : publicMethods) //iterate over methods 
    { 
     //check name and parameter-count (mabye needs some more checks...paramter types can also be checked...) 
     if (aMethod.getName().startsWith("set") && aMethod.getParameterCount() == 1) 
     { 
      Object[] parms = new Object[]{"test"}; //only one parm (can be multiple params) 
      aMethod.invoke(testObj, parms); //call setter-method here 
     } 
    } 
} 

您也可以保存在列表中的所有setter方法的方法/供以後再使用設置...
但正如其他人已經說過,你要通過做小心所以(使用反射)!

乾杯!

+0

謝謝!這正是我所期待的。 – user8352652

2

你不能輕易 - 而你不應該。

你看,你的POJO課程提供了一些制定者。它們全都具有截然不同的含義。你的第一個錯誤是,所有這些領域都在你的模型:

  • 性別不是一個字符串。它寧願成爲一個枚舉。
  • 「數字」不是一個字符串。它應該是int/long/double(無論這個屬性背後的想法是什麼)

換句話說:前提是「輸入」數據表示爲array/list已經有缺陷。

你寫的代碼幾乎沒有任何有用的抽象。所以 - 不必擔心如何在某些循環環境中調用這些setter方法 - 而應該退後一步並改進模型。

提示:如果這實際上是從字符串輸入中填充POJO對象 - 然後將字符串轉換爲JSON格式,並使用gson或jackson等工具爲您執行基於映射的映射。

+0

感謝您的快速回復。這只是一個示例POJO,在我的例子中,我有超過30個不同類型的字段。這就是爲什麼我不想通過構造函數填充它,但我想自動填充循環或以其他方式。 – user8352652

+0

它不會好轉。即使POJO應遵循[SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))原則。在一個班有30個領域......已經是一種氣味了。 – GhostCat

0

「在方法上迭代」在OO編程中似乎是一個錯誤的想法。您可以簡單地將構造函數添加到您的類中,以設置所有屬性,然後根據需要在循環中調用該構造函數,以創建具有所需數據的新對象。

在類中定義:

public TestPojo(String name, String number, String id, String sex){ 

    this.name = name; 
    this.number = number; 
    this.id = id; 
    this.sex = sex; 

} 

而且使用列表在這裏是沒有多大意義。我建議使用HashMap然後在for循環中遍歷它,以適當調用上述構造函數。