Распаковка массива с использованием отражения - PullRequest
8 голосов
/ 11 ноября 2011

Я пытаюсь распаковать массив, полученный при отражении полей объекта.Я установил значение общего поля для объекта.Если это массив, я хочу преобразовать свой общий объект в массив (независимо от его типа) и извлечь его содержимое

fields[i].setAccessible(true);
        String key = fields[i].getName();
        Object value = fields[i].get(obj);

        if (value.getClass().isArray()){
            unpackArray(value);
        }

В моем методе unpackArray я попытался привести значение объекта к java.util.Arrays, java.reflect.Array и Array [], но каждый раз, когда это мне не разрешается.

Есть ли способ, как я могу привести свой Object к универсальному массиву?

МногиеСпасибо Сэм

Ответы [ 2 ]

11 голосов
/ 11 ноября 2011

Единственным родительским классом всех массивов является Object.

Чтобы извлечь значения массива как Object[], вы можете использовать.

public static Object[] unpack(Object array) {
    Object[] array2 = new Object[Array.getLength(array)];
    for(int i=0;i<array2.length;i++)
        array2[i] = Array.get(array, i);
    return array2;
}
2 голосов
/ 11 ноября 2011

К сожалению, примитивные массивы и массивы объектов не имеют общего класса массива в качестве предка.Таким образом, единственная опция для распаковки - это бокс примитивных массивов.Если вы выполняете нулевые проверки и isArray до вызова этого метода, вы можете удалить некоторые из проверок.

public static Object[] unpack(final Object value)
{
    if(value == null) return null;
    if(value.getClass().isArray())
    {
        if(value instanceof Object[])
        {
            return (Object[])value;
        }
        else // box primitive arrays
        {
            final Object[] boxedArray = new Object[Array.getLength(value)];
            for(int index=0;index<boxedArray.length;index++)
            {
                boxedArray[index] = Array.get(value, index); // automatic boxing
            }
            return boxedArray;
        }
    }
    else throw new IllegalArgumentException("Not an array");
}

Тест: http://ideone.com/iHQKY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...