Was versteht man unter Introspektion und wie funktioniert sie? v.1.5

Unter Introspektion versteht man die Untersuchung vorhandener Klassen zur Laufzeit. Als Ausgangspunkt stellt hierzu das package java.lang die Klasse Class bereit.

Im Beispiel werden zwei Klassen deklariert, die Klasse Introspection, die die eigentliche Laufzeitklasse ist und die Klasse Auto. Sie dient lediglich als Demonstrationsobjekt und soll hinsichtlich der in ihr enthaltenen Felder und Methoden untersucht werden.

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Introspection {

    public void schauNach() {
        Class<Auto> a = Auto.class;
        Method[] meths = a.getMethods();

        for (Method m : meths) {
            System.out.println("Methodenname: " + m.getName());

            Class<?>[] params = m.getParameterTypes();
            for (int i = 0; i < params.length; i++)
                System.out.println("Parametertyp: " + params[i]);
            System.out.println();
        }

        Field[] fields = a.getDeclaredFields();

        for (Field f : fields) {
            System.out.println("Feldname: " + f.getName());
        }
    }

    public static void main(String[] args) {
        Introspection in = new Introspection();
        in.schauNach();
    }
}

class Auto {
    int tempo;
    int radZahl;

    public Auto(int tempo, int radZahl) {
        this.tempo = tempo;
        this.radZahl = radZahl;
    }

    public void beschleunige(int menge) {
        tempo += menge;
    }

    public void verzoegere() {
        tempo--;
        if (tempo < 0)
            tempo = 0;
    }
}

Die Untersuchung der Klasse Auto findet in der Methode public void schauNach() statt. Hier wird zunächst ein Class-Objekt der Klasse Auto erzeugt. Die Methode Class.getMethods() liefert ein Array vom Typ Method[], das in der Folge in einer for-Schleife durchlaufen wird. In dieser wird als erstes der Klassenname ausgegeben. Danach folgen in weiteren Schleifen die Ausgaben der Methodennamen und -parameter, sowie der Feldnamen. Sie werden ebenfalls jeweils zunächst in Arrays abgelegt.
Es ist wichtig zu wissen, dass die Ausgaben sich auch auf die Superklasse(n) beziehen. Da die Klasse Auto keine explizite Superklasse besitzt, erbt sie von java.lang.Object. Deren Methoden und Felder werden bei der Ausgabe entsprechend berücksichtigt.