运行时Java Hashmap到对象

标签 java object casting hashmap runtime

有没有办法像这样在运行时将 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 查询结果解析为一个对象。现在我已经编写了自己的序列化算法。机器人它不起作用。有没有更好的方法从数据库中反序列化对象?

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

最佳答案

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

Is there any way of accessing a variable dynamically by name at execution time?

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

你可以使用反射:

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

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

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

关于运行时Java Hashmap到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839698/

相关文章:

java - Mockito 不 mock

javascript将数组转换为对象以通过ajax发送数据

javascript - 如何检查对象是否不是数组中的第一个或最后一个但有重复项?

c# - 从组合框中获取选定的对象

java - 将子类转换为父类(super class)实现的子接口(interface)

Java复制到剪贴板

java - Struts 2 URL 不会替换为正确的值

javascript - Typescript 通用类型保护

未知长度的 C 字符串定义

java - 我需要帮助从目录中的所有文件读取数据