segunda-feira, 23 de novembro de 2009

Usando "reflection" para conexões com diferentes sistemas

Um simples exemplo prático do uso de reflection para comunicação com backends distintos, definidos em tempo de execução.

- Definindo uma interface comum, a ser seguida por todos os possíveis adaptadores a serem utilizados:


public interface Logger {
void log();
}


- Implementando a interface de logging de dois modos distintos:

public class DBLogger implements Logger {

public void log() {
// TODO Auto-generated method stub
System.out.println("Logging on the Database");
}

}

e, em seguida:

public class TextLogger implements Logger {

public void log() {
// TODO Auto-generated method stub
System.out.println("Logging on a text file");
}

}

- Executando a aplicação, definindo o mecanismo de logging a ser utilizado em tempo de execução:

public class Test {
public static void main(String [] args) {

Logger myLogger = null;

try {
Class myClass = Class.forName("DBLogger");
myLogger = (Logger) myClass.newInstance();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

myLogger.log();

}
}


Obviamente o nome da classe a ser utilizada não será definida de modo estático, como apresentado acima, para fins de ilustração. Desse modo conseguimos utilizar o mecanismo desejado, podendo criar novas classes implementadoras sem a necessidade de alterar a classe principal (ou chamadora).

Nenhum comentário: