【问题标题】:Change static element value through reflection with string as element name通过以字符串为元素名称的反射更改静态元素值
【发布时间】:2016-02-29 22:42:15
【问题描述】:

我正在从数据库中获取数据并通过 DBUserValues 类的字段名称进行访问,并希望将结果保存在 DBUserValues 对象中。总是只有一个结果。如何使用字符串访问这些静态变量?有没有更好的方法来做到这一点?

public class DBUserValues {
    public static String username;
    public static String firstname;
}

查看结果并保存

for (Field field : user.getClass().getDeclaredFields()) {
    // Result should get saved in DBUserValues object
    // DBUserValues.username = result.getString(field.getName();
    // DBUserValues.(field.getName()) = result.getString(field.getName());
}

【问题讨论】:

  • 您确定在DBUserValues 类中将字段声明为static 是个好主意吗?

标签: java reflection


【解决方案1】:

您必须创建一个 POJO 来映射具有私有属性和公共 getter 和 setter 的数据库字段:

class DBUserValues {
    // private attributes
    private String username;
    private String firstname;

    // public getters and setters
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
} 

我现在如何调用这些 getter 和 setter? field.invoke("set" + field.getName(), result.getString(field.getName())) 不起作用。

您必须创建一个DBUserValues 对象来填充,也缺少代码,但我认为您不必遍历user.getClass().getDeclaredFields() 结果:

// get database values
Field[] fields = user.getClass().getDeclaredFields();

// create an object to populate:
DBUserValues user = new DBUserValues();
user.setUserName(fields[0]);
user.serFirstName(fields[1]);

添加:检查this 和this 以了解如何从user.getClass().getDeclaredFields() 检索正确信息。

【讨论】:

  • 我现在如何调用这些getter和setter? field.invoke("set" + field.getName(), result.getString(field.getName())) 不起作用
  • 感谢重播。问题是我不想这样做,因为这是真实 DBUserValues 类的简化版本。真正的类有13个字段,将来会改变,所以我想以一种允许轻松更改DB的方式来做。
  • 有什么问题?你必须以某种方式填充你的对象,如果你不使用休眠来映射你的数据库和一些像推土机这样的填充器,你必须手动执行该操作......对不起,我认为没有其他方式。
  • 好吧,如果没有更好的方法,我会那样做。感谢您的帮助。 :)
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多