2013-05-31 2 views
5

Я пытаюсь создать свою собственную библиотеку для сериализации и де-сериализации примитивных типов из класса в xml и из xml в экземпляр класса с использованием отражения для изучения шаблонов именования методов и возврата метода типы.Java Convert Неизвестный примитивный массив в массив объектов

До сих пор я мог сделать это со всеми базовыми примитивными типами, но я застрял в сериализации массива из тех же примитивов.

Например я вызываю метод класса, чтобы получить массив примитивов:

method.invoke(clazz, (Object[])null); 

Этот метод будет возвращать только примитивный массив int[], double[], float[], char[] и т.д., хотя мы не знаем, какой она будет.

Я попытался с помощью родового, таких как

T t = (T)method.invoke(clazz, (Object[])null); 
T[] t = (T[])method.invoke(clazz, (Object[])null); 

Но это не дает мне отлито из примитивного массива к объекту.

И вы не можете использовать Array.newInstance при условии, что мы не знаем тип.

Есть ли способ, которым я могу преобразовать этот массив примитивов, чтобы описать массив объектов в общем виде.

В общем смысле это означает, что не нужно знать или проверять тип массива. Или я должен просто перебирать все примитивные типы и обрабатывать их отдельно.

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

Заранее спасибо.

+0

+1 Отличный вопрос! –

ответ

9

Вы можете использовать Array служебный класс

public static Object[] toObjectArray(Object array) { 
    int length = Array.getLength(array); 
    Object[] ret = new Object[length]; 
    for(int i = 0; i < length; i++) 
     ret[i] = Array.get(array, i); 
    return ret; 
} 
+1

Он отлично работал. Я никогда не думал, что могу получить доступ к объекту в виде массива. Спасибо. –

0

ли java.lang.reflect.Array.get() делать то, что вы хотите?

+0

Вам также понадобится getLength() –

+0

Это будет мой следующий шаг. Это позволило бы мне получить элемент из массива, но мне все же нужно знать, как сохранить его в правильном массиве. –

0
Object result = method.invoke(clazz, (Object[])null); 
Class<?> arrayKlazz = result.getClass(); 
if (arrayKlazz.isArray()) { 
    Class<?> klazz = result.getComponentType(); 
    if (klazz == int.class) { 
     int[] intArray = arrayKlazz.cast(result); 
    } 
} 

кажется больше, чтобы держать наши правила (примитивные) массивы в объекте (result выше).

+0

Как это поможет получить 'Object []' из результата? –

+0

'Object []' уже ответил. Но решение проблемы сериализации с 'Object []' для 'int []', 'double []' и т. Д. Кажется немного зашедшим слишком далеко. ** Общий массив должен храниться в объекте **. Я хочу предложить это без особого внимания. Если 'Object []' желает - отлично. –

Смежные вопросы