Nachdem wir sowohl getClass() als auch instanceof verstanden haben, erstellen wir eine umfassendere Utility-Klasse, die detaillierte Typinformationen für jedes Java-Objekt ausgeben kann.
Erstellen einer wiederverwendbaren TypeInfo-Utility
Eine gut gestaltete Utility-Klasse kann es einfacher machen, Objekte in Ihrem Code zu inspizieren. Erstellen wir eine Datei namens TypeInfo.java im Verzeichnis java-type-printing:
import java.lang.reflect.Modifier;
public class TypeInfo {
/**
* Prints detailed information about an object's type
*/
public static void printTypeInfo(Object obj) {
if (obj == null) {
System.out.println("Cannot determine type: object is null");
return;
}
Class<?> clazz = obj.getClass();
System.out.println("Type Information for: " + obj);
System.out.println("---------------------------");
System.out.println("Class name: " + clazz.getName());
System.out.println("Simple name: " + clazz.getSimpleName());
System.out.println("Package: " + clazz.getPackageName());
System.out.println("Is Array: " + clazz.isArray());
System.out.println("Is Interface: " + clazz.isInterface());
System.out.println("Is Primitive: " + clazz.isPrimitive());
// Get modifiers (public, private, final, etc.)
int modifiers = clazz.getModifiers();
System.out.println("Is Public: " + Modifier.isPublic(modifiers));
System.out.println("Is Final: " + Modifier.isFinal(modifiers));
// Get superclass
Class<?> superClass = clazz.getSuperclass();
System.out.println("Superclass: " + (superClass != null ? superClass.getName() : "none"));
// Get interfaces
Class<?>[] interfaces = clazz.getInterfaces();
System.out.print("Interfaces: ");
if (interfaces.length > 0) {
for (int i = 0; i < interfaces.length; i++) {
System.out.print(interfaces[i].getName());
if (i < interfaces.length - 1) {
System.out.print(", ");
}
}
System.out.println();
} else {
System.out.println("none");
}
}
}
Erstellen einer Testklasse für TypeInfo
Erstellen wir nun eine weitere Datei namens TypeInfoDemo.java, um unsere Utility-Klasse zu testen:
import java.util.ArrayList;
import java.util.List;
public class TypeInfoDemo {
public static void main(String[] args) {
// Test with different types of objects
String text = "Hello, TypeInfo!";
Integer number = 200;
ArrayList<String> list = new ArrayList<>();
// Print type information for different objects
TypeInfo.printTypeInfo(text);
System.out.println();
TypeInfo.printTypeInfo(number);
System.out.println();
TypeInfo.printTypeInfo(list);
System.out.println();
// Try with an array
int[] numbers = {1, 2, 3, 4, 5};
TypeInfo.printTypeInfo(numbers);
}
}
Kompilieren und Ausführen des Programms
Kompilieren und führen Sie das Testprogramm aus:
cd ~/project/java-type-printing
javac TypeInfo.java TypeInfoDemo.java
java TypeInfoDemo
Sie sollten eine detaillierte Ausgabe für jedes Objekt sehen, ähnlich wie:
Type Information for: Hello, TypeInfo!
---------------------------
Class name: java.lang.String
Simple name: String
Package: java.lang
Is Array: false
Is Interface: false
Is Primitive: false
Is Public: true
Is Final: true
Superclass: java.lang.Object
Interfaces: java.io.Serializable, java.lang.Comparable, java.lang.CharSequence
Type Information for: 200
---------------------------
Class name: java.lang.Integer
Simple name: Integer
Package: java.lang
Is Array: false
Is Interface: false
Is Primitive: false
Is Public: true
Is Final: true
Superclass: java.lang.Number
Interfaces: java.lang.Comparable, java.lang.constant.Constable, java.lang.constant.ConstantDesc
...
Verständnis der Reflection API
Unsere TypeInfo-Utility demonstriert die Leistungsfähigkeit der Java Reflection API, mit der Sie die Struktur von Klassen zur Laufzeit untersuchen können. Die Reflection API kann:
- Klassen, Interfaces, Felder und Methoden inspizieren
- Die Modifizierer, Rückgabetypen und Parameter bestimmen
- Neue Instanzen erstellen, Methoden aufrufen und auf Felder zugreifen
Obwohl leistungsstark, sollte Reflection vorsichtig verwendet werden, da es die Leistung beeinträchtigen und die Kapselung verletzen kann. Für Debugging- und Lernzwecke ist es jedoch ein ausgezeichnetes Werkzeug, um das Typsystem von Java zu verstehen.