Es gibt drei Möglichkeiten, um an das Class-Objekt einer Klasse zu kommen:
- Mit der Methode getClass(), die in Object definiert ist. Diese Variante setzt voraus, dass man eine Referenz auf ein Objekt hat, dessen Class-Objekt ermittelt werden soll.
// o: Referenz auf beliebiges Objekt
Class c = o.getClass();
- Weiterhin definiert Class die Methode forName(), der ein Klassenname als String übergeben wird und die ein Class-Objekt für diese Klasse zurückgibt.
Hierzu lädt forName() die Klasse zuvor in die Virtual Machine. In diesem Beispiel wird das Class-Objekt für die Klasse Vector abgerufen:
try {
Class c = Class.forName("java.util.Vector");
}
catch(ClassNotFoundException e) {
}
Da es passieren kann, dass der Bytecode der gewünschten Klasse zur Laufzeit nicht verfügbar ist, muss eine Exception abgefangen werden.
-
Das in Version 1.1 eingeführte Konstrukt der Class-Literale gestattet es, Class-Objekte auch deklarativ zu ermitteln:
Class c = java.util.Vector.class;
Bei dieser Variante wird bereits beim Kompilieren geprüft, ob der Bytecode der betreffenden Klasse vorhanden ist.
Eine Kombination der Methoden forName() und newInstance() kann man dazu verwenden, um Exemplare von Klassen völlig dynamisch zu erzeugen, ohne dass die Klassen beim Kompilieren bekannt sein müssen. Die Methode in diesem Beispiel erzeugt ein Exemplar zum übergebenen Klassennamen:
public Object createInstance(String name)
throws Exception {
// Class-Objekt holen
Class c = Class.forName(name);
// Exemplar erzeugen und zurückliefern
return c.newInstance();
}
In diesem Beispiel wird der parameterlose Konstruktor der Klasse aufgerufen. Wenn ein Konstruktor mit Parametern aufgerufen werden soll, muss auf das Reflection API zurückgegriffen werden.
In Java 1.1 wurden auch Class-Objekte für die einfachen Datentypen eingeführt.
Diese können entweder über das statische Datenelement TYPE der jeweiligen Wrapper-Klasse
oder mit einem Class-Literal ermittelt werden.
Das Class-Objekt für den Typ int kann man also mit einer dieser beiden Zeilen erhalten:
Class c1 = Integer.TYPE;
Class c2 = int.class;
Auch für den Typ void wurde eine neue Wrapper-Klasse definiert, deren einziger Bestandteil TYPE ist.
Ob ein Class-Objekt eine Klasse oder einen einfachen Datentyp repräsentiert, kann mit dessen Methode isPrimitive() ermittelt werden.