具有动态字段的对象/具有Java中不同值的Hashmap

时间:2015-09-17 12:08:02

标签: java

我们正在Java中的数据库中进行一些知识发现。

我们有不同的数据库,我们一无所知。

示例场景:我们想检查实体是否具有属性名称并重命名。在python / js / dynamic语言中,这将是微不足道的:

if Object.hasKey(name) => Object.name = "Jordan"

有没有办法在java中存储和操作通用对象? 由于我们不了解对象结构,显然类已经不在了。 Hashmaps也不会删除它,因为该对象可以将所有SQL类型作为属性类型,而Hashmaps仅限于同类字段。

3 个答案:

答案 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