Maintenant que nous comprenons à la fois getClass() et instanceof, créons une classe utilitaire plus complète qui peut afficher des informations de type détaillées pour n'importe quel objet Java.
Création d'un utilitaire TypeInfo réutilisable
Une classe utilitaire bien conçue peut faciliter l'inspection des objets dans votre code. Créons un fichier nommé TypeInfo.java dans le répertoire 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");
}
}
}
Création d'une classe de test pour TypeInfo
Maintenant, créons un autre fichier appelé TypeInfoDemo.java pour tester notre classe utilitaire :
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);
}
}
Compiler et exécuter le programme
Compilez et exécutez le programme de test :
cd ~/project/java-type-printing
javac TypeInfo.java TypeInfoDemo.java
java TypeInfoDemo
Vous devriez voir une sortie détaillée pour chaque objet, similaire à :
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
...
Comprendre l'API Reflection
Notre utilitaire TypeInfo démontre la puissance de l'API Reflection de Java, qui vous permet d'examiner la structure des classes à l'exécution (runtime). L'API Reflection peut :
- Inspecter les classes, les interfaces, les champs et les méthodes
- Déterminer les modificateurs, les types de retour et les paramètres
- Créer de nouvelles instances, invoquer des méthodes et accéder aux champs
Bien que puissante, la Reflection doit être utilisée avec précaution car elle peut avoir un impact sur les performances et peut casser l'encapsulation. Cependant, à des fins de débogage et d'apprentissage, c'est un excellent outil pour comprendre le système de types de Java.