循环对象setters java

时间:2017-08-14 11:14:29

标签: java reflection

我有一个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对象?是否可以迭代所有对象设置器并在适当的位置设置List中的数据?我知道在这种情况下反思会有所帮助。

3 个答案:

答案 0 :(得分:4)

这是一个简单示例,可以通过反射调用 setters (需要调整):

[如果这是一个好方法,则是另一个问题。但要回答你的问题:]

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方法保存在列表/集中以供以后重复使用...
但正如其他人已经说过的那样,你必须小心这样做(使用反射)!

干杯!

答案 1 :(得分:2)

你不容易 - 而且你不应该这样做。

你知道,你的POJO课程提供了一些制定者。所有这些都具有 distinct 的含义。您的第一个错误是模型中所有这些字段都是字符串

  • 性别不是字符串。它宁愿是一个枚举。
  • &#34;数&#34;不是一个字符串。它应该是int / long / double(无论该属性背后的想法是什么)

换句话说:你的前提是&#34;输入&#34;数据表示为数组/列表已经存在缺陷。

您编写的代码几乎没有提供任何有用的抽象。所以 - 而不是担心如何在某些循环上下文中调用这些setter方法 - 您应该退一步并改进模型。

并提示:如果这真的是关于从字符串输入填充POJO对象 - 那么将您的字符串转换为JSON格式,并使用gson或jackson等工具为您执行(基于反射)映射。

答案 2 :(得分:0)

在OO编程中,“迭代方法”似乎是一个错误的想法。您只需在设置所有属性的类中添加构造函数,然后根据需要在循环中调用该构造函数,以创建包含所需数据的新对象。

在你的班级中定义:

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

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

}

此处使用List也没有多大意义。我建议使用HashMap然后在for循环中迭代它,正确调用上面的构造函数。