Java Reflection


Java Reflections Api kann genutzt werden, um Klassen, deren Namen erst zur Laufzeit bekannt sind, erst dann auch aufzurufen.

Dies kann z.B. nötig sein, wenn eine vorher unbekannte Anzahl von Filtern durchlaufen werden soll oder aber, bestimmte Operationen sollen, durch Benutzereingabe, auf einem Datenbestand ausgeführt werden.

Um das Ganze zu verdeutlichen, folgt der Code.

Die Klasse, die wird über Reflection aufrufen wollen.

package lh.it;

public class ReflectedClass {
	public static  String  printAndReturn(){
		System.out.println("Reflected Class : print() method called");
		return "Reflected Class method returns String";
	}
}

Eine einfache Klasse, die nur eine Methode hat, die etwas ausgibt und zurückgibt.

Als nächstes die Main Klasse, in der die reflektierte Klasse gesucht und die entsprechende Methode aufgerufen wird.

package lh.it;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
	public static void main(String[] args){
		try {
			Class<?> myClass = Class.forName("lh.it.ReflectedClass");
			Method method = myClass.getMethod( "printAndReturn");
			String returnType = method.getReturnType().getName();
			Object returnValue = method.invoke(myClass);
			System.out.printf( "(%s) %s", returnType, returnValue );
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

	}
}

Erklärung:
Class<?> myClass = Class.forName("lh.it.ReflectedClass");
In dieser Zeile holen wir uns die Klasse über ihren Namen (Package + Name)

Method method = myClass.getMethod( "printAndReturn");
Jetzt rufen wir auf der Klasse die Methode „getMethod“ auf, die uns, wenn sie exsistiert, die von uns gewünschte Methode zurück gibt.

String returnType = method.getReturnType().getName();
Durch den Aufruf von „getReturnType().getName()“ erfahren wir, was genau unsere Funktion zurück gibt.

Object returnValue = method.invoke(null);
Hier wird die Methode aufgerufen und der Rückgabewert gespeichert.

System.out.printf( "(%s) %s", returnType, returnValue );
und ausgegeben.

So einfach sind Java Reflections