Wie lassen sich Methodenaufrufe zur Laufzeit dynamisch ausführen?

Mit Hilfe der Klasse Statement können Methoden zur Laufzeit dynamisch gewählt und ausgeführt werden.

Im Beispiel werden zehn Methoden deklariert, die jeweils einen kurzen Text ausgeben. Ein Teil dieses Textes wird als Parameter an die Methoden übergeben, um diesen Aspekt zu demonstrieren.

import java.beans.Statement;
import java.util.ArrayList;

public class DynamischeMethodenClass {

    public static void methodeEins(String name) {
        System.out.println("Ein Männername: " + name);
    }

    public static void methodeZwei(String name) {
        System.out.println("Ein Frauenname: " + name);
    }

    public static void methodeDrei(String name) {
        System.out.println("Ein Tier: " + name);
    }

    public static void methodeVier(String name) {
        System.out.println("Eine Pflanze: " + name);
    }

    public static void methodeFuenf(String name) {
        System.out.println("Ein Gebirge: " + name);
    }

    public static void methodeSechs(String name) {
        System.out.println("Eine Stadt: " + name);
    }

    public static void methodeSieben(String name) {
        System.out.println("Ein Bundesland: " + name);
    }

    public static void methodeAcht(String name) {
        System.out.println("Ein Land: " + name);
    }

    public static void methodeNeun(String name) {
        System.out.println("Eine Speise: " + name);
    }

    public static void methodeZehn(String name) {
        System.out.println("Ein Getränk: " + name);
    }

    private void fuehreAus() {
        ArrayList list = new ArrayList(0);
        list.add("methodeEins");
        list.add(new Object[] { "Karl" });
        list.add("methodeZwei");
        list.add(new Object[] { "Hanna" });
        list.add("methodeDrei");
        list.add(new Object[] { "Flusspferd" });
        list.add("methodeVier");
        list.add(new Object[] { "Primel" });
        list.add("methodeFuenf");
        list.add(new Object[] { "Himalaya" });
        list.add("methodeSechs");
        list.add(new Object[] { "Berlin" });
        list.add("methodeSieben");
        list.add(new Object[] { "Sachsen" });
        list.add("methodeAcht");
        list.add(new Object[] { "Deutschland" });
        list.add("methodeNeun");
        list.add(new Object[] { "Nudeln" });
        list.add("methodeZehn");
        list.add(new Object[] { "Bier" });

        int n = (int) (Math.random() * 20);
        if(n % 2 != 0)  n = n-1;
        
        final Statement exp = new Statement(this, (String) list.get(n), (Object[]) list.get(n + 1));
        try {
            exp.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        DynamischeMethodenClass dmc = new DynamischeMethodenClass();
        dmc.fuehreAus();
    }
}

Zunächst werden der Name der Methoden als String und deren Argumente in einem Object[]-Array jeweils nacheinander in einer ArrayList gespeichert. Die Methodennamen besetzen somit die geraden Indizes der ArrayList, die Arrays mit den Parametern jeweils die folgenden ungeraden.
Zur Demonstration des Prinzips soll jeweils eine der deklarierten Methoden (pseudo-)zufällig ausgewählt und ausgeführt werden. Der jeweilige Index wird mit Hilfe der Klasse Math und deren Methode random() erzeugt.
Ein Objekt der Klasse Statement wird mittels Übergabe dreier Parameter gebildet:

  1. Ziel des Statements
  2. Methodenname als String
  3. Array der Methodenparameter

Ziel des Statements ist die aktuelle Klasse (dieser Parameter darf nicht null sein). Die anderen beiden Parameter werden jeweils mit Hilfe des ermittelten Index aus der ArraList der Methoden geladen.
Die Ausführung übernimmt die Statement-Methode execute(). Sie kann bei Scheitern eine Exception werfen, die abgefangen werden muss.