Java,将Class的实例转换为HashMap

时间:2016-05-04 09:55:13

标签: java

如果我有这样的课程:

class MyObject {
    public int myInt;
    public String myString;
}

是否可以在不实现转换代码的情况下将此类的实例转换为HashMap?

MyObject obj = new MyObject();
obj.myInt = 1; obj.myString = "string";
HashMap<String, Object> hs = convert(obj);

hs.getInt("myInt"); // returns 1
hs.getString("myString"); // returns "string"

Java是否提供了这种解决方案,或者我需要自己实现convert

My Class有超过50个字段,每个字段的写入转换器都不是很好。

5 个答案:

答案 0 :(得分:4)

您可以使用反射来实现此行为。您可以将要转换的类的所有字段都映射到此字段的迭代,并将每个字段的名称作为映射的键。这将导致从String到object的映射。

Map<String, Object> myObjectAsDict = new HashMap<>();    
Field[] allFields = SomeClass.class.getDeclaredFields();
    for (Field field : allFields) {
        Class<?> targetType = field.getType();
        Object objectValue = targetType.newInstance();
        Object value = field.get(objectValue);
        myObjectAsDict.put(field.getName(), value);
    }
}

答案 1 :(得分:2)

这样的事情可以解决问题:

MyObject obj = new MyObject();
obj.myInt = 1; obj.myString = "string";
Map<String, Object> map = new HashMap<>();
// Use MyObject.class.getFields() instead of getDeclaredFields()
// If you are interested in public fields only
for (Field field : MyObject.class.getDeclaredFields()) {
    // Skip this if you intend to access to public fields only
    if (!field.isAccessible()) {
        field.setAccessible(true);
    }
    map.put(field.getName(), field.get(obj));
}
System.out.println(map);

<强>输出:

{myString=string, myInt=1}

答案 2 :(得分:1)

您可以考虑使用地图而不是类。

或者让您的班级扩展地图,例如

public class MyObject extends HashMap<String, Object> {

}

答案 3 :(得分:0)

使用杰克逊图书馆,这也是可能的

MyObject obj = new MyObject(); obj.myInt = 1; obj.myString = "1"; ObjectMapper mapObject= new ObjectMapper(); Map<String, Object> mapObj= mapObject.convertValue(obj, Map.class);

答案 4 :(得分:0)

如果您不想使用Reflection,那么可以使用我的把戏。希望这对某人有帮助。

假设您的课程如下所示。

public class MyClass {
         private int id;
         private String name; 
}

现在在此类中重写toString()方法。在Eclipse中,也存在用于生成此方法的快捷方式。

public class MyClass {
    private int id;
    private String name; 

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("MyClass [id=").append(id).append(", name=").append(name).append("]");
        return builder.toString();
    }

}

现在在此类内编写一个方法,该方法会将您的对象转换为Map<String,String>

public Map<String, String> asMap() {
        Map<String, String> map = new HashMap<String, String>();
        String stringRepresentation = this.toString();
        if (stringRepresentation == null || stringRepresentation.trim().equals("")) {
            return map;
        }
        if (stringRepresentation.contains("[")) {
            int index = stringRepresentation.indexOf("[");
            stringRepresentation = stringRepresentation.substring(index + 1, stringRepresentation.length());
        }
        if (stringRepresentation.endsWith("]")) {
            stringRepresentation = stringRepresentation.substring(0, stringRepresentation.length() - 1);
        }
        String[] commaSeprated = stringRepresentation.split(",");
        for (int i = 0; i < commaSeprated.length; i++) {
            String keyEqualsValue = commaSeprated[i];
            keyEqualsValue = keyEqualsValue.trim();
            if (keyEqualsValue.equals("") || !keyEqualsValue.contains("=")) {
                continue;
            }
            String[] keyValue = keyEqualsValue.split("=", 2);
            if (keyValue.length > 1) {
                map.put(keyValue[0].trim(), keyValue[1].trim());
            }

        }
        return map;
    }

现在,您可以从应用程序中的任何位置调用此方法,以从Object中获取HashMap。干杯