2017-08-14 6 views
0

私はPOJOオブジェクトと適切なデータのコレクションを持っています。オブジェクトセッターをループする。

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オブジェクトを埋めることができますか?すべてのオブジェクトセッターを繰り返し、リストから適切な場所にデータを設定するのは可能でしょうか?私は反射がこの場合に役立つことを知っています。

答えて

2

は(調整する必要がある)反射を介しセッターを呼び出す単純な例あります。
...あなたはまた、/後で再利用のために設定され、リスト内のすべてのセッター・メソッドを保存することができます]

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

しかし、他の人がすでに言ったように、あなたが実行して注意する必要があります。しかし、あなたの質問に答えるためにそう(反射を使って)!

乾杯!

+0

ありがとう!それはまさに私が探していたものです。 – user8352652

2

あなたは簡単にはできません。そうしないでください。

POJOクラスには、いくつかのセッターが用意されています。それらのすべてには、という別の意味があります。意味はです。

  • 性別が文字列ではありません:あなたの最初の間違いは、これらのフィールドのすべては、あなたのモデルで文字列であるということです。むしろ列挙型になります。
  • "number"は文字列ではありません。

つまり、「入力」データが配列/リストに既に欠陥があると表現されていることを前提としています。これはむしろint/long/doubleでなければなりません。

あなたが書いたコードは、ほとんど役に立たない抽象化を提供しません。したがって、ループのコンテキストでこれらのセッターメソッドを呼び出す方法を心配するのではなく、むしろ後退してモデルを改善する必要があります。

ヒント:実際には文字列入力からPOJOオブジェクトを作成する場合は、文字列をJSON形式にし、gsonやjacksonなどのツールを使用してマッピングを行います(反射ベース)。

+0

ありがとうございました。これはちょうどサンプルPOJOです、私の場合、私は異なるタイプの30以上のフィールドを持っています。だから私はコンストラクタを介してそれを埋めることを望んでいないが、私はループまたはいくつかの他の方法でそれを自動的に記入したい。 – user8352652

+0

それは良くなりません。POJOでも[SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))の原則に従うべきです。 1つのクラスに30のフィールドを持つことは、すでにそれ自体が匂いです。 – GhostCat

0

"Iterating over methods"は、オブジェクト指向プログラミングでは間違った考えです。 コンストラクタをすべての属性を設定したクラスに追加して、そのコンストラクタをループ内で呼び出すだけで、必要なデータを含む新しいオブジェクトを作成できます。あなたのクラスで

は定義:

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

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

} 

もリストを使用すると、ここにはあまり意味がありません。私はHashMapを使って、上記のコンストラクタの適切な呼び出しを行うforループで反復処理することをお勧めします。これは、良いアプローチである別の質問ある場合

[:ここ

関連する問題