Создание утилитарного класса для получения информации о типе
Теперь, когда мы понимаем и getClass(), и instanceof, давайте создадим более комплексный утилитарный класс, который сможет выводить подробную информацию о типе для любого объекта Java.
Создание повторно используемой утилиты TypeInfo
Хорошо спроектированный утилитарный класс может упростить проверку объектов в вашем коде. Давайте создадим файл с именем TypeInfo.java в каталоге 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");
}
}
}
Создание тестового класса для TypeInfo
Теперь давайте создадим еще один файл с именем TypeInfoDemo.java, чтобы протестировать наш утилитарный класс:
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);
}
}
Скомпилируйте и запустите программу
Скомпилируйте и запустите тестовую программу:
cd ~/project/java-type-printing
javac TypeInfo.java TypeInfoDemo.java
java TypeInfoDemo
Вы должны увидеть подробный вывод для каждого объекта, аналогичный:
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
...
Понимание API Reflection
Наша утилита TypeInfo демонстрирует мощь Java Reflection API, который позволяет вам исследовать структуру классов во время выполнения. Reflection API может:
- Инспектировать классы, интерфейсы, поля и методы
- Определять модификаторы, типы возвращаемых значений и параметры
- Создавать новые экземпляры, вызывать методы и получать доступ к полям
Несмотря на свою мощь, Reflection следует использовать осторожно, поскольку он может повлиять на производительность и может нарушить инкапсуляцию. Однако для отладки и обучения это отличный инструмент для понимания системы типов Java.