Если я понял, что вы имеете в виду, ваше решение должно быть следующим:
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReflectionToMap {
private static void toMap(Object obj, Map<String, Object> map, boolean includeSuperclass) {
Class<?> cls = obj.getClass();
try {
if (cls.isArray()) {
for (int i = 0; i < Array.getLength(obj); i++)
map.put("" + i, Array.get(obj, i));
} else {
while (cls != null && !cls.isInterface()) {
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
if (Modifier.isStatic(field.getModifiers()))
continue;
boolean accessible = field.isAccessible();
field.setAccessible(true);
Object value = field.get(obj);
field.setAccessible(accessible);
if (includeSuperclass)
map.put(cls.getCanonicalName() + "." + field.getName(), value);
else
map.put(field.getName(), value);
}
if (includeSuperclass)
cls = cls.getSuperclass();
else
return;
}
}
} catch (Exception e) {
System.err.println("Something gone wrong...");
e.printStackTrace();
}
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
Map<String, Object> map = new HashMap<>();
toMap(list, map, true);
System.out.println(map);
map.clear();
toMap(list, map, false);
System.out.println(map);
}
}
Метод toMap()
принимает объект для преобразования в карту и карту, которая будет содержать результат. Метод также включает в себя поля из суперклассов. Каждое имя поля включает каноническое имя класса / абстрактного класса, к которому оно принадлежит. Включенный основной метод выводит следующее:
{java.util.ArrayList.elementData=[Ljava.lang.Object;@70dea4e, java.util.ArrayList.size=2, java.util.AbstractList.modCount=2}
{size=2, elementData=[Ljava.lang.Object;@70dea4e}
Пропущенное исключение не может быть вызвано, поскольку доступ к полям безопасен.
Вы можете использовать метод toMap()
в toMap()
метод вашего класса тоже.
Как видите, этот метод принимает логическое значение, чтобы запретить включение полей из суперклассов. В этом случае он не включает каноническое имя класса в ключах карты.
Обратите внимание, что если obj
- массив, карта будет выглядеть примерно так:
1 -> obj1
2 -> obj2
3 -> obj3
...and so on...