Reflexión en Java

La reflexión es la capacidad que tiene un programa para conocer su estructura de alto nivel. Se puede saber a partir de una clase ya compilada todos sus métodos, propiedades, instanciarla, ejecutar sus métodos,…

Cuando el código fuente de un programa se compila, pierde la información sobre la estructura del programa conforme se genera el código de bajo nivel. La reflexión nos permite, en tiempo de ejecución, volver a conocer la estructura de alto nivel.

En Java, el API Relection es quien nos proporciona todo lo que necesitamos.

Mediante el método estático  forName(String) de la clase Class se puede crear el molde de una clase a través de su nombre.


Class myClass = Class.forName("className");

Y mediante el método getInstance() se crea un objeto de esa clase. A partir de este momento ya se puede acceder a las propiedades y métodos de esa clase.


myClass.getInstance();

Y ya, con sólo esto, la potencia y las posibilidades se disparan.

Caso de uso

En un programa necesitaba, a partir de un fichero XML, lanzar diferentes clases. La primera solución era a base de if … else, pero el problema es que ese fichero podía crecer mucho y además no quería tener que estar modificando todo el rato la clase principal.

En el fichero XML se indican las clases a cargar y si están activas o no


<?xml version="1.0" encoding="UTF-8"?>
<crawlers>
 <crawler class="es.reflectionDemo.crawlers.Crawler1" isEnabled="true" />
 <crawler class="es.reflectionDemo.crawlers.Crawler2" isEnabled="true" />
</crawlers>

Y el código para cargar las clases, queda tan sencillo como


public class ReflectionDemo {
 public static void main(String[] args) {
  try {
   Document xmlDocument = XMLUtil.loadXMLFile("C:\\ReflectionDemo.xml");
   Element rootElement = XMLUtil.getRootElement("crawlers", xmlDocument);
   ArrayList<Element> crawlerElements = XMLUtil.getElements("crawler", rootElement);
   for (Element crawlerElement : crawlerElements) {
    boolean isEnabled = Boolean.parseBoolean(XMLUtil.getAttribute("isEnabled", crawlerElement, false));
    if (isEnabled) {
     Class crawlerClass = Class.forName(crawlerElement.getAttribute("class"));
     CrawlerManager crawler = (CrawlerManager) crawlerClass.newInstance();
     crawler.init();
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

Ahora si quiero cargar nuevas clases sólo tengo que crearlas y añadirlas al fichero XML.

NOTA: con lo explicado en el post de XML, me creé una clase para poder manejar fácilmente todos los métodos que allí se vieron, de ahí los XMLUtil. que se ven en el código.

En un siguiente post veremos cómo poder acceder y ejecutar los métodos de una clase a través de la reflexión.

Anuncios
    • morphy
    • 9/12/11

    Amigos tengo una pregunta mm aver si me ayudan un poco tengo una clase:

    public class grid_marca{

    public static DefaultTableModel cont_table;

    public static JPanel grid_marca(){
    //aqui el cuerpo de la tabla
    cont_table………………
    }

    }

    luego tengo una segunda clase:

    public class Grid {
    public void grid(){

    grid_marca objeto=new grid_marca()
    objeto.cont_table.addRow(fila);

    }

    }

    lo que quiero es que el “grid_marca” sea dinamico(por ejemplo quiero poner grid_venta u otro) y puedo agregar los datos a la tabla de esta segunda clase.

    Le agradeciria mucho su respuesta.

    • Selita
    • 27/06/13

    muy bien explicado

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s