4.16.1 | Aufruf von Konstruktoren |
Um einen Konstruktor mit dem Reflection-API aufzurufen, muss zunächst das Constructor-Exemplar für den gewünschten Konstruktor ermittelt werden. Hierzu dient die Methode getConstructor() der Klasse Class, der zur Identifikation des richtigen Konstruktors ein Array mit den Parametertypen übergeben werden. Dieses Array muss die Class-Objekte der einzelnen Parametertypen enthalten, und zwar in der Reihenfolge, in der sie im Konstruktor deklariert sind.
Das folgende Beispiel zeigt schematisch, wie eine Applikation eine Plug-in-Klasse laden und anschließend ein Exemplar erzeugen kann. Es wird dabei angenommen, dass der Konstruktor der Plug-in-Klasse über einen Parameter verfügt, und zwar ein Properties-Exemplar, mit dem die Applikation dem Plug-in globale Einstellungen übergibt.public PlugInInterface loadPlugIn(String className, Properties settings) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException { Class plugInClass; Constructor plugInConstructor; PlugInInterface plugIn; // Class-Objekt der Plug-In-Klasse ermitteln plugInClass = Class.forName(className); // Es wird ein Konstruktor mit einem Properties-Parameter gesucht Class[] paramTypes = new Class[]{java.util.Properties.class}; Object[] paramValues; // Konstruktor ermitteln plugInConstructor = plugInClass.getConstructor(paramTypes); // Zusammenbauen des Parameter-Arrays... paramValues = new Object[] {settings}; // ... und Aufruf des Konstruktors plugIn = (PlugInInterface)plugInConstructor.newInstance(paramValues); return plugIn; }Zu beachten ist, dass die Parameterwerte des Konstruktors in Form eines Arrays vom Elementtyp Object übergeben werden. Dieses Array wurde im Beispiel mit der ZeileparamValues = new Object[] {settings};erzeugt. Für Parameter mit einfachen Datentypen muss ein Exemplar der entsprechenden Wrapper-Klasse erzeugt werden. Für einen Konstruktor mit einem int-Parameter müsste das Array also folgendermaßen belegt werden.paramValues = new Object[]{new Integer(42)};Material zum Beispiel
- Quelltexte: