Das Class-Objekt

Die Klasse Class

  • Zu jeder in die Java VM geladenen Klasse (inklusive Interfaces) gibt es ein Objekt von Typ Class – das Class-Objekt
  • Auch die primitiven Typen haben ein Class-Objekt
  • Das Class-Objekt ist der Einstiegspunkt in das Reflection API

Class-Objekt beschaffen

  • über Class-Literale:
    Class<String> clazz = String.class;
  • über den Namen:
    Class<?> clazz = Class.forName("java.lang.String");
  • über ein Objekt:
    Class<?> clazz = "Hello World".getClass();
  • über die Wrapper:
    Class<Integer> clazz = Integer.TYPE;
  • über einen Classloader:
    Class<?> clazz = ClassLoader.
    getSystemClassLoader().loadClass("java.lang.String");

Die wichtigsten Methoden von Class

  • static Class<?> forName(String className) – Class-Objekt zu der Klasse mit dem angegebenen Namen liefern
  • T newInstance() – eine neue Instanz erzeugen (erfordert einen Default-Konstruktor)
  • String getName() – liefert den Namen der Klasse
  • Class<? super T> getSuperclass() – liefert die Superklasse
  • Package getPackage() – liefert das Paket
  • boolean isInstance(Object obj) – stellt fest, ob obj Instanz der Klasse ist
  • boolean isAssignableFrom(Class<?> cls) – stellt fest, ob ein Objekt vom Typ der Klasse mit einer Referenz vom Typ cls verwendet werden kann
  • ClassLoader getClassLoader() – liefert den Class Loader, der die Klasse geladen hat
  • isInterface(), isArray(), isPrimitive(), isAnnotation(), isSynthetic(), isAnonymousClass(), isLocalClass(), isMemberClass(), isEnum()
  • Class<?>[] getInterfaces() – liefert die Interfaces die implementiert werden
  • Field[] getFields() – liefert die (sichtbaren) Felder
  • Method[] getMethods() – liefert die Methoden
  • Constructor<?>[] getConstructors() – liefert die Konstruktoren
  • Field getField(String name) – liefert das Feld mit Namen name
  • Method getMethod(String name, Class<?>... parameterTypes) – liefert die Methode mit dem Namen name und den gegebenen Parametern
  • Constructor<T> getConstructor(Class<?>... parameterTypes) – liefert die Konstruktoren mit den gegebenen Parametern
  • T cast(Object obj) – castet ein Objekt auf den Typ der Klasse

Beispiel: Class

Class<Geschaeftsfuehrer> clazz = Geschaeftsfuehrer.class;

System.out.println(clazz.getSuperclass());
// -> class de.smits_net.pr2.classobj.Manager

System.out.println(clazz.getName());
// -> de.smits_net.pr2.classobj.Geschaeftsfuehrer

System.out.println(clazz.isInterface()); // false

System.out.println(clazz.getPackage());
// -> package de.smits_net.pr2.classobj

System.out.println(clazz.isAssignableFrom(Mitarbeiter.class));
// -> false

System.out.println(Mitarbeiter.class.isAssignableFrom(clazz));
// -> true
System.out.println(clazz.isInstance(new Vorstand()));
// -> false

System.out.println(clazz.isInstance(new Geschaeftsfuehrer()));
// -> true

printArray(clazz.getFields());
// -> []

printArray(clazz.getConstructors());
// -> [public de.smits_net.pr2.classobj.Geschaeftsfuehrer()]

printArray(clazz.getMethods());
// [public boolean java.lang.Object.equals(java.lang.Object),
// public java.lang.String ...Geschaeftsfuehrer.getDetails()
// public final native void java.lang.Object.notify(),
// ...

Beispiel: getClass()

public void automatischeErhöhung(Mitarbeiter mi) {

    if (mi.getClass() == Geschaeftsfuehrer.class) {

        Geschaeftsfuehrer g = (Geschaeftsfuehrer) mi;

        if (g.prokura) {
            mi.gehalt = mi.gehalt * (1 + 0.2);
        } else {
            mi.gehalt = mi.gehalt * (1 + 0.1);
        }
    } else if (mi.getClass() == Manager.class) {
        mi.gehalt = mi.gehalt * (1 + 0.05);
    } else {
        mi.gehalt = mi.gehalt * (1 + 0.002);
    }
}

Copyright © 2025 Thomas Smits