viernes, 21 de agosto de 2009

Reflection, carga dinámica de clases

En algunas ocaciones es necesario expadir la funcionalidad de aplicaciones java en tiempo de ejecución, dinámicamente, cuando la aplicación está ejecutandose y no se quiere/puede reiniciar el servicio.
Para ello nos podemos valer de dos utilidades: Las Interfaces y el Objeto Class:

Interfaces:
Una interfaz en Java es una clase en la que todos sus métodos son abstractos. En ellas se especifica qué se debe hacer pero no su implementación.

Class:
Tiene un método llamado "forName(String)" que permite buscar una clase dinámicamente.

En el ejemplo que he creado, se puede pasar por como argumento de aplicación una cadena de texto que servirá para localizar la clase:

INTERFAZ - IJuego.java

package juegos;

public interface IJuego {

boolean doInit();
boolean doClientAction(int usuario_id, Object response);
boolean doEnd();
}


IMPLEMENTACION - JuegoA.java

package juegos.implementation;

import juegos.IJuego;

public class JuegoA implements IJuego {

@Override
public boolean doInit(){
System.out.println("doInit juego 11: " + this.getClass().getName() );
return true;
}
@Override
public boolean doClientAction(int usuario_id, Object response){
return true;
}
@Override
public boolean doEnd(){
return true;
}
}


UTILIZACION DINAMICA - Principal.java

import juegos.IJuego;


public class Principal {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String classname = null;
if (args.length > 0) {
classname = (String) args[0];
}
if(classname!=null){
System.out.println("Nombre de clase definido como argumento");
new Principal().initGame( classname );
}else{
new Principal().initGame("juegos.implementation.JuegoC");
}
}
private void initGame( String nombreclase ){
IJuego juego;
Class instancia;
try{
instancia = Class.forName( nombreclase );
juego = (IJuego) instancia.newInstance();
juego.doInit();
}catch( Exception e ){
System.out.println( "Exepción: " + e.getMessage() );
e.printStackTrace();
}

}
}



Fuentes (proyecto java en eclipse)