2016-05-04 2 views
1

Если у меня есть класс вроде этого:Java, конвертировать экземпляр класса для HashMap

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 по себе?

Мой класс имеет более 50 полей и конвертер для каждого поля - это не очень хорошая идея.

+0

HashMaps имеют ключи и значения (2 вещи), а не 50 полей. Можете ли вы пояснить, чего вы пытаетесь достичь здесь? –

+0

, вы также должны предоставить пользовательскую реализацию 'Map', потому что допустимый метод получения значения для ключа из' Map' является методом 'get (Object)'. Нет ничего похожего на 'getInt' или' getString', чтобы возвращать разные типы из Map. В конце концов, это не имело бы смысла иметь их, потому что тип возврата определяется вторым родовым типом. – SomeJavaGuy

+0

@TimBiegeleisen Я хочу преобразовать все поля моего объекта в ключи и значения hashmap. –

ответ

1

Вы можете использовать отражение для реализации этого поведения. Вы можете получить все поля класса, который вы хотите преобразовать, для сопоставления итераций по этим полям и присвоения имени каждого поля в качестве ключа карты. Это приведет к отображению от String к объекту.

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); 
    } 
} 
+0

Если некоторые поля являются списками объектов? Как «отразить» их? –

+0

Если отношения объекта образуют дерево, а не график, вы можете использовать описанный здесь метод http://stackoverflow.com/questions/6133660/recursive-beanutils-describe – PKuhn

0

Возможно, вы захотите использовать карту вместо класса.

Или ваш класс продлить карту, такие как

public class MyObject extends HashMap<String, Object> { 

} 
1

Нечто подобное будет делать трюк:

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} 
Смежные вопросы