2010-08-04 32 views
8

estoy usando la reflexión para recuperar un campo de instancia como este:El uso de la reflexión para recuperar una matriz de primitivas de un tipo desconocido

private int[] numbers = .... 

Con el objeto de campo, puedo comprobar si el campo contiene una matriz y si lo hace, me gustaría recorrer las entradas de la matriz. Así que si el objeto que contiene el campo de arriba se llama "foo", entonces me gustaría tener algo como esto:

field.setAccessible(true); 
Object value = field.get(foo); 

La variable valor por encima contendrá mi matriz de INT. ¿Cómo trato ese objeto como una matriz regular e itero sobre sus valores?

Edit: lo siento, me perdí un punto crucial de mi historia anterior. Estoy haciendo lo anterior de forma genérica, así que no sé qué primitiva contiene la matriz. Podría ser un int [] o un largo [] etc. Por lo tanto, la conversión a int [] no funcionaría en el caso largo [] obviamente. Uy!

Respuesta

12

Puede utilizar la clase java.lang.reflect.Array acceder a la longitud y los elementos individuales de una matriz. El método get debería funcionar de una manera genérica, posiblemente envolviendo primitivas en sus objetos de envoltura.

+0

Veo que el método get recuperará el valor en un índice determinado, sin embargo, ¿cómo se obtiene la longitud de la matriz? – digiarnie

+3

@digiarnie, el método está un poco escondido en el javadoc entre los otros captadores, es 'Array.getLength (matriz de objetos)' :) –

+0

sí, eso es exactamente lo que quería y sí, tienes razón, estaba escondido entre todos aquellos otros getters y simplemente me lo perdí! ¡Gracias! – digiarnie

1

This page tiene un buen tratamiento en la sección "Uso de matrices".

La simplificación (y el cambio de los nombres de variables ;-) de su ejemplo de clase array2,

int valuecast[] = (int[])value; 

parece ser lo que está buscando.

Editar: el OP ahora aclara que él no sabe si el tipo primitivo de la matriz es int, long, o lo que sea. Creo que la única manera de lidiar con esto es un if/else "árbol" basado en comprobaciones del tipo de primitiva (como en, Integer.TYPE o lo que sea) - seguido de la declaración correspondiente y el molde en la rama condicional que identifica el tipo en cuestión.

0

que puede echarlo a un conjunto como éste

int[] a = (int[])value; 
+0

Lo siento, me perdí un punto crucial en mi pregunta: he realizado la corrección. – digiarnie

0

Mencionado en Oracles Tutorial esto es fácilmente alcanzable con array.getClass().getComponentType(). Esto devuelve la clase de las instancias en la matriz.

A continuación, puede verificarlo contra la clase primitiva ubicada dentro de cada objeto contenedor. Por ejemplo:

if (array.getClass().getComponentType().equals(Boolean.TYPE)) { 
    boolean[] booleanArray = (boolean[]) array; 
} 
Cuestiones relacionadas