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)
这听起来像你实际想要问的是:
有没有办法在执行时按名称动态访问变量?
答案是"是的,但这通常是一个坏主意".
你可以使用反射:
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变量.)
| 归档时间: |
|
| 查看次数: |
2594 次 |
| 最近记录: |