我们正在Java中的数据库中进行一些知识发现。
我们有不同的数据库,我们一无所知。
示例场景:我们想检查实体是否具有属性名称并重命名。在python / js / dynamic语言中,这将是微不足道的:
if Object.hasKey(name) => Object.name = "Jordan"
有没有办法在java中存储和操作通用对象? 由于我们不了解对象结构,显然类已经不在了。 Hashmaps也不会删除它,因为该对象可以将所有SQL类型作为属性类型,而Hashmaps仅限于同类字段。
答案 0 :(得分:1)
除了@dotvav评论之外,请查看Apache Commons BeanUtils,这样可以简化反射工作。
示例:
Map<String, String> props = BeanUtils.describe(someObject);
if (props.containsKey("name")) {
BeanUtils.setProperty(someObject, "name", "value");
}
答案 1 :(得分:1)
无论如何你都可以使用hashmap。
Map<Strung, Object> map = new Hashmap<>();
map.put("name", new Integer());
map.put("another name", new String());
String value = (String)map.get("another name");
String value = (String)map.get("name"); // You get error here because integer type stored in map.
// check with 'instanceof' for type if necessary
一切正常
答案 2 :(得分:1)
您可以使用反射来更改对象的私有字段。
假设我们有一个Human
对象,其中包含name
字段:
public static class Human {
private String name;
public Human(String name) {
this.name = name;
}
public String toString() {
return new StringBuilder("Name: ").append(this.name).toString();
}
}
与建议的其他一些答案一样,您可以使用HashMap<String, Object>
来存储任何对象。您只需遍历地图并将每个对象传递给以下方法:
public static void changeName(Object obj, String newName) throws IllegalArgumentException, IllegalAccessException {
for (Field f:obj.getClass().getDeclaredFields()) {
if (f.getName().toLowerCase().equals("name")) {
f.setAccessible(true);
f.set(obj, newName);
f.setAccessible(false);
}
}
}
此方法检索对象的所有字段,并将字段名称与&#34; name&#34;进行比较。如果标识了某个字段,则会更改可访问性(如果是私有字段)并将字段值更改为newName
。
Human me = new Human("Ian");
System.out.println(me);
changeName(me, "Jan");
System.out.println(me);
输出:
Name: Ian
Name: Jan