[英]how to exclude a property from object while putting into hashmap in java
[英]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.