Reflexion

Colladox
22 de Diciembre del 2005

Hola a todos,

Estoy haciendo una clase para dotar de una cierta funcionalidad a todas las clases que hereden de la misma, y necesitaba saber si en un cierto momento puedo saber la clase en concreto que se está ejecutando. Es decir si yo tengo la clase A de la que heredan la clase B y la C, en un método de A necesitaba saber si se trata de la clase B o C. Me imagino que esto se puede hacer con reflexión pero no se como.

chuidiang
22 de Diciembre del 2005
Hola:

Desde cualquier instancia de una clase puedes llamar al método getClass() que te devuelve el nombre de la clase.

También puedes mirar si es instanceof.

La diferencia entre uno y otro es que el primero te da el nombre de la clase que es la instancia. El segundo te dice si esa clase esta en el arbol de herencia.

En tu ejemplo,

A a = new B;

a.getClass().getName() te devuelve "B"

a instanceof A es true
a instanceof B es true tambien
a instanceof C es false.

Puede que me equivoque un poco en la sintaxis o el nombre exacto de los métodos, pero no te costará encontrar el nombre exacto del método.

Se bueno.

malexicarum
22 de Diciembre del 2005
Esta bien. usar instanceof es una buena solucion para determinar la instancia de cualquier objeto.
Para ampliar el ejemplo anterior, y llevarlo un poco mas a codigo, obtenemos esto:

A objA = new B();

if(objA instanceof A){
// el objA es instancia de A
}
if(objA instanceof B){
// el objA es tambien instancia de B
}
// EN ESTOS DOS IF, el resultado sera VERDADERO.

Otro dato curioso, para el que quiera ver: Si yo tengo una interfaz, a esa interfaz tambien le puedo preguntar si su objeto cumple tambien otra interfaz o clase.
Ejemplo.

CLASE CLIENTE implementa InterA, InterB

...cuando tenemos el objeto aislado en alguna otra clase, podriamos hacer lo siguiente:

InterA i1 = (InterA) objeto; // casting del objeto Cliente a la interfaz InterA
///// todo bien hasta ahi... pero
if(i1 instanceof InterB){
// tambien i1 es InterB
}

Es decir, aunque una interfaz solo muestre a si sola, esta tambien puede transformarce en otra interfaz o clase ( haciendo casting porsupuesto). Eso nos quiere decir, que las interfaces no son mas que mascaras para los sistemas, pero internamente siempre siguen siendo los objetos originales.

Gracias.