Manchmal möchte man wissen welche Methoden in einer Klasse zur Verfügung stehen bzw. mit welchen Gettern/Settern man auf Attribute zugreifen kann. Muss man dies zur Laufzeit ermitteln führt kein Weg an der sogenannten Java Reflection vorbei, dabei kann mit Hilfe von Javamethoden auf Metadaten anderer Javaklassen zugegriffen werden. Man kann also quasi zur Laufzeit ermitteln welche Methoden eine bestimmte Klasse anbietet. Die Java Reflection API kann natürlich noch mehr, für dieses Beispiel reicht jedoch dieses grobe Verständnis.
public static void printGettersSetters(Class aClass){ Method[] methods = aClass.getMethods(); for(Method method : methods){ if(isGetter(method)) System.out.println("getter: " + method); if(isSetter(method)) System.out.println("setter: " + method); } } public static boolean isGetter(Method method){ if(!method.getName().startsWith("get")) return false; if(method.getParameterTypes().length != 0) return false; if(void.class.equals(method.getReturnType()) return false; return true; } public static boolean isSetter(Method method){ if(!method.getName().startsWith("set")) return false; if(method.getParameterTypes().length != 1) return false; return true; } |
Die obige Methode printGettersSetters nutzt Java Reflection um die Methoden einer gegebenen Klasse aClass auszulesen, diese werden dann auf die typischen Merkmale von Gettern und Settern untersucht, heißt:
Getter:
– der Methodenname startet mit „get“
– es werden keine Parameter übergeben
– es wird nicht void zurückgegeben
Setter:
– der Methodenname startet mit „set“
– es wird genau ein Wert als Parameter übergeben
An diesen Merkmalen kann man die entsprechenden Methoden erkennen. Zumindest wenn sie sauber programmiert* sind ;). Im Einzelfall kann die Auswahl natürlich weiter eingeschränkt werden, zum Beispiel auf Getter die nur in einer bestimmten Klasse vorkommen (siehe weiter unten), dies kann bei Vererbungen nützlich sein, um nicht alle Getter der Elternklasse zu bekommen. An den Methoden isSetter und isGetter erkennt man auch gut einige nette Möglichkeiten der Java Reflection. Es können nahezu alle Metadaten der Klassen und Methoden ausgelesen und verarbeitet werden, richtig eingesetzt ist dies eine sehr mächtige Möglichkeit mit Java zu programmieren.
Buchtipp zum Thema Java Reflection: Java Reflection in Action
Nachtrag:
Nur bestimmte Getter eine vorgegebenen Klasse:
// Nur Getter: falls aus Klasse XYZ stammend if (!method.getDeclaringClass().equals(XYZ.class)) { return false; } |
Eine Alternative beschreibt http://openbook.rheinwerk-verlag.de/javainsel/#mj78760cf4e539e932b61342ec7f89e97a
Danke!
War wirklich hilfreicht.