繁体   English   中英

Java Hashmap运行时对象

[英]Java Hashmap to Object while running

有没有办法在运行时像这样将Java HashMap的值强制转换为对象:

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();
        }
    }
}

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

有什么方法可以在执行时按名称动态访问变量?

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

您可以使用反射:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM