1

有没有办法在运行时将 Java HashMap 的值转换为 Object,如下所示:

claas Foo {
    public int a;
    public String b;
}
Foo foo = new Foo();

HashMap<String, Object> map = new HashMap<String, Object>();

for(Map.Entry<Foo, Bar> entry : map.entrySet()) {
  String propertyName foo = entry.getKey();
  Object o = entry.getValue();

  foo[propertyName] = o; // Does not wokring
}

我试图将 SQL 查询结果解析为对象。现在我已经编写了自己的 Seralize 算法。机器人它不起作用。有没有更好的方法从数据库中反序列化对象?

Connection connection = DriverManager.getConnection(instance);
PreparedStatement statment = connection.prepareStatement("SELECT * FROM Foo;");

Foo data;

ResultSet rs = statment.executeQuery(query);
    if (rs != null && rs.next()) {
        for (Field field : data.getClass().getDeclaredFields()) {
        try {
            if ((String.class.equals(field.getType()))) {
                field.set(String.class, rs.getString(field.getName()));
            } else if ((Boolean.class.equals(field.getType()))) {
                field.set(Boolean.class, rs.getBoolean(field.getName()));
            } else if ((Integer.class.equals(field.getType()))) {
                field.set(Integer.class, rs.getInt(field.getName()));
            }

        } catch (IllegalAccessException e) {
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}
4

1 回答 1

9

听起来您实际上要问的是:

有没有办法在执行时按名称动态访问变量?

答案是“是的,但这通常是个坏主意”。

您可以使用反射:

Field field = Foo.class.getDeclaredField(entry.getKey());
field.set(foo, entry.getValue());

但这会很慢,而且您只会在执行时发现无效的键/值。这通常是一个坏主意。如果您只动态地了解事物,则可以使它们保持动态 - 将它们保留在地图中。如果您想存储任意属性,通常有更好的解决问题的方法(例如自定义序列化),但如果没有更多细节,我们无法帮助您找到更好的方法。

(另请注意,您需要Map.Entry<String, Object>,而不是Map.Entry<Foo, Bar>您的entry变量。)

于 2013-02-12T18:58:56.797 回答