2013-05-31 9 views
5

Próbowałem utworzyć własną bibliotekę do serializowania i dekompilowania typów pierwotnych od klasy do xml i od xml do instancji klasy za pomocą odbicia, aby zbadać wzorce nazw metod i metodę zwracania typy.Konwersja Java Nieznany prymitywny macierz do obiektu Array

Do tej pory udało mi się zrobić to ze wszystkimi podstawowymi typami pierwotnymi, ale utknąłem na serializowaniu tablicy tych samych prymitywów.

Na przykład ja wywołać metodę klasy, aby uzyskać tablicę prymitywów:

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

Metoda ta zwróci tylko prymitywną tablicę int[], double[], float[], char[] itd choć nie wiemy, który z nich będzie.

Próbowałem za pomocą rodzajowe takie jak

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

Ale nie pozwól mi wylane z prymitywnej tablicy do obiektu.

I nie można użyć Array.newInstance zakładając, że nie znamy typu.

Czy istnieje sposób, że mogę przekonwertować tę tablicę prymitywów, aby wypowiedzieć tablicę obiektów w sposób ogólny.

W ogólny sposób oznacza to, że nie trzeba znać ani sprawdzać, jaki jest typ tablicy. A może powinienem przejrzeć wszystkie pierwotne typy i obsłużyć je wszystkie osobno.

Mogę to zrobić w obie strony. Jedynym powodem, dla którego chcę to zrobić w sposób ogólny, jest ograniczenie nadmiarowego kodu.

Z góry dziękuję.

+0

+1 Świetne pytanie! –

Odpowiedz

9

Można użyć klasy Array użytkową

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

To działało idealnie. Nigdy nie myślałem, że mogę uzyskać dostęp do obiektu jako tablicy. Dziękuję Ci. –

0

Czy java.lang.reflect.Array.get() robić to, co chcesz?

+0

Potrzebujesz także getLength() –

+0

To byłby mój następny krok. To pozwoliłoby mi uzyskać element z tablicy, ale nadal muszę wiedzieć, jak go najpierw zapisać w odpowiedniej tablicy. –

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

wydaje się bardziej jest właściwa do przechowywania (prymitywne) tablic w obiekcie (result powyżej).

+0

W jaki sposób pomoże to uzyskać 'Object []' z wyniku? –

+0

'Object []' już otrzymał odpowiedź. Ale rozwiązanie problemu serializacji z 'Object []' dla 'int []', 'double []' etcetera wydaje się nieco posuwać zbyt daleko. ** Ogólna tablica powinna się znajdować w obiekcie **. Chcę zasugerować, że bez zbyt dużego nacisku. Jeśli "Object []" jest pożądany - dobrze. –