如果我有这样的课:
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)
您可以使用反射来实现此行为。您可以获取要转换为映射的类的所有字段,遍历这些字段并将每个字段的名称作为映射的键。这将导致从字符串到对象的映射。
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)
像这样的事情就可以解决问题:
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)
| 归档时间: |
|
| 查看次数: |
9132 次 |
| 最近记录: |