Java,将Class的实例转换为HashMap

Mr.*_*r.D 9 java

如果我有这样的课:

class MyObject {
    public int myInt;
    public String myString;
}
Run Code Online (Sandbox Code Playgroud)

是否可以在不实现转换代码的情况下将此类的实例转换为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"
Run Code Online (Sandbox Code Playgroud)

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

我的班级有50多个字段,每个字段的写入转换器都不是那么好主意.

pro*_*lus 14

使用 jackson 库,这也是可能的

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


PKu*_*uhn 9

您可以使用反射来实现此行为。您可以获取要转换为映射的类的所有字段,遍历这些字段并将每个字段的名称作为映射的键。这将导致从字符串到对象的映射。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*tto 5

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

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);
Run Code Online (Sandbox Code Playgroud)

输出:

{myString=string, myInt=1}
Run Code Online (Sandbox Code Playgroud)