Java Hashmap在运行时对象

ego*_*ier 1 java casting runtime object hashmap

有没有办法在运行时将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
}
Run Code Online (Sandbox Code Playgroud)

我试图将SQL-Query结果解析为一个对象.现在我已经编写了自己的Seralize-Algorithm.它不起作用.有没有更好的方法从数据库中取消对象的对象?

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

这听起来像你实际想要问的是:

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

答案是"是的,但这通常是一个坏主意".

你可以使用反射:

Field field = Foo.class.getDeclaredField(entry.getKey());
field.set(foo, entry.getValue());
Run Code Online (Sandbox Code Playgroud)

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

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