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 liefernT newInstance() – eine neue Instanz erzeugen (erfordert einen Default-Konstruktor)String getName() – liefert den Namen der KlasseClass<? super T> getSuperclass() – liefert die SuperklassePackage getPackage() – liefert das Paketboolean 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 kannClassLoader getClassLoader() – liefert den Class Loader, der die Klasse geladen hatisInterface(), isArray(), isPrimitive(), isAnnotation(), isSynthetic(), isAnonymousClass(), isLocalClass(), isMemberClass(), isEnum()
Class<?>[] getInterfaces() – liefert die Interfaces die implementiert werdenField[] getFields() – liefert die (sichtbaren) FelderMethod[] getMethods() – liefert die MethodenConstructor<?>[] getConstructors() – liefert die KonstruktorenField getField(String name) – liefert das Feld mit Namen nameMethod 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 ParameternT 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);
}
}