有没有办法像这样在运行时将 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/