如果我有这样的课程:
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个字段,每个字段的写入转换器都不是很好。
答案 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。干杯