java - registro - ¿Cómo ver si un objeto es una matriz sin usar la reflexión?
pasar un arreglo de objetos como parametro en java (4)
¿Cómo puedo ver en Java si un objeto es una matriz sin usar la reflexión? ¿Y cómo puedo iterar a través de todos los elementos sin usar el reflejo?
Uso Google GWT, así que no puedo usar la reflexión :(
Me encantaría implementar los siguientes métodos sin usar refelection:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
Por cierto: tampoco quiero usar JavaScript para poder usarlo en entornos que no sean GWT.
No existe una relación de subtipificación entre las matrices de tipo primitivo o entre una matriz de tipo primitivo y una matriz de un tipo de referencia. Ver JLS 4.10.3 .
Por lo tanto, lo siguiente es incorrecto como prueba para ver si obj
es una matriz de cualquier tipo :
// INCORRECT!
public boolean isArray(final Object obj) {
return obj instanceof Object[];
}
Específicamente, no funciona si obj
es una matriz 1-D de primitivas. (Sin embargo, funciona para matrices primitivas con dimensiones más altas, porque todos los tipos de matriz son subtipos de Object
. Pero es discutible en este caso).
Uso Google GWT, así que no puedo usar la reflexión :(
La mejor solución (para la parte de la matriz isArray
) depende de lo que se considera "usar reflexión".
Si llamar a
obj.getClass().isArray()
no cuenta como usar la reflexión, entonces esa es la mejor solución.De lo contrario, la mejor manera de averiguar si un objeto tiene un tipo de matriz es usar una secuencia de expresiones de
instanceof
.public boolean isArray(final Object obj) { return obj instanceof Object[] || obj instanceof boolean[] || obj instanceof byte[] || obj instanceof short[] || obj instanceof char[] || obj instanceof int[] || obj instanceof long[] || obj instanceof float[] || obj instanceof double[]; }
También podría tratar de jugar con el nombre de la clase del objeto de la siguiente manera, pero la llamada a
obj.getClass()
está al borde de la reflexión.public boolean isArray(final Object obj) { return obj.getClass().toString().charAt(0) == ''[''; }
Puede usar Class.isArray()
public static boolean isArray(Object obj)
{
return obj!=null && obj.getClass().isArray();
}
Esto funciona tanto para matrices de tipo primitivo como para objeto.
Para toString eche un vistazo a Arrays.toString
. Deberá verificar el tipo de matriz y llamar al método apropiado de toString
.
Puedes usar instanceof
.
JLS 15.20.2 Operador de comparación de tipos instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
En tiempo de ejecución, el resultado del operador
instanceof
estrue
si el valor de RelationalExpression no esnull
y la referencia se puede convertir al ReferenceType sin generar unaClassCastException
. De lo contrario, el resultado esfalse
.
Eso significa que puedes hacer algo como esto:
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
Debería verificar si el objeto es una instanceof boolean[]
, byte[]
, short[]
, char[]
, int[]
, long[]
, float[]
, double[]
u Object[]
, si desea detectar todos los tipos de matriz.
Además, una int[][]
es una instanceof Object[]
, por lo que dependiendo de cómo se manejen las matrices anidadas, puede complicarse.
Para toString
, java.util.Arrays
tiene un toString(int[])
y otras sobrecargas que puede usar. También tiene deepToString(Object[])
para matrices anidadas.
public String toString(Object arr) {
if (arr instanceof int[]) {
return Arrays.toString((int[]) arr);
} else //...
}
Va a ser muy repetitivo (pero incluso java.util.Arrays
es muy repetitivo ), pero así es en Java con matrices.
Ver también
Se puede acceder a cada elemento de una matriz por separado utilizando el siguiente código:
Object o=...;
if ( o.getClass().isArray() ) {
for(int i=0; i<Array.getLength(o); i++){
System.out.println(Array.get(o, i));
}
}
Tenga en cuenta que no es necesario saber qué tipo de matriz subyacente es, ya que funcionará para cualquier matriz.