style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Reflexión en Java II, Obtener propiedades de una clase desconocidas en tiempo de ejecución

En el pos anterior mostré como instanciar un par de clases sencillas según una cadena obtenida desde el teclado esto sin saber que teclearía el usuario y sin usar if’s ni switch si no con la reflexión que es el mecanismo por el cual podemos conocer los detalles y manejar en tiempo de ejecución de una clase “desconocida” en codificación.
En este post mostrare como obtener información de las propiedades de nuestra clase.
Para este post he modificado las clases A y B, agregándole propiedades
classA

/**
 *
 * @author jfcodiaz
 * <a href="http://www.devtics.com.mx
" title="www.devtics.com.mx
">www.devtics.com.mx
</a> * 17/04/2010
 */

public class A {
    public int n1;
    private int R;
    public int n2;
    public B b;
    @Override
    public String toString() {
        return "Esto es una clase A";
    }
    public void saludo(){
        System.out.println("Hola Mundo!");
    }
}

classB

/**
 *
 * @author jfcodiaz
 * wariodiaz@gmail.com
 * <a href="http://www.devtics.com.mx
" title="www.devtics.com.mx
">www.devtics.com.mx
</a> * 15/04/2010
 */

public class B {
    public String propiedad1;
    public String propiedad2;
    @Override
    public String toString() {
        return "esto es una B";
    }    
}

Como ya se menciono anteriormente lo primero que tenemos que hacer es obtener la clase y almacenarla en un objeto tipo Class para esto hacemos uso del método estático Class.forName(Stirng ClassName), la cual recibe como String el nombre de la Clase.

Java a través de la clase java.lang.reflect.Field representa las propiedades públicas una clase, solo tenemos acceso a las propiedades y métodos público de la clase por obvias razones no podemos ver los métodos y propiedades privadas.
Lo primero que tenemos que hacer es recuperar nuestra clase:

 Class _class = Class.forName("A");

Para obtener una propiedad la cual conocemos su nombre podremos usar el método _class. getField(String nombrePropiedad), en cambio si no conocemos el nombre de las propiedades que es lo más lógico en este tema. Podremos obtener una lista de las propiedades con _class.getFields() el cual nos retorna un array de Fields con las propiedades de la clase.

Field properties[] = _class.getFields();

Para saber el identificador del Field consultamos el método .getName del objeto Field
Podemos saber el tipo de dato de la propiedad consultado al método getType() del objeto Field, si es un dato primitivo nos retornara una cadena con el tipo de dato, si es una objeto no indicará la clase en el Classpath:
Reflexion2.java:

import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Pakos
 * <a href="http://www.devtics.com.mx
" title="www.devtics.com.mx
">www.devtics.com.mx
</a> * 17/04/2007
 */

public class Reflexion2 {
    public static void main(String[] args) {
        try {
            Class _class = Class.forName("B");
            Field properties[] = _class.getFields();
            for (int i = 0; i < properties.length; i++) {
                Field field = properties[i];
                System.out.println(field.getName() +" > "+field.getType());
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Reflexion2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Out:

propiedad1 > class java.lang.String
propiedad2 > class java.lang.String

Ahora si modificamos la clase para que liste la clase A esta debería de ser la salida:

Class _class = Class.forName("A");

Out:

n1 > int
n2 > int
b > class B

Observe que en no se lista la propiedad R de la clase A ya que esta es una propiedad privada

Con esto termino este post. En el próximo mostrare como podemos modificar y/o consultar el valor de las propiedades.
Código Fuente en proyecto NetBeans6.8

>> Reflexión en Java III, Acceso y modificación de propiedades

<<Reflexión en Java I, Instancia una clase desconocidas en tiempo de ejecución

www.devtics.com.mx

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">