Метод getClass(), объект класс, знакомство с Reflection - 1

— Привет, Амиго!

А теперь самое интересное. Мы познакомимся с классом Class и немного с Reflection.
Как ты уже, наверное, успел понять, в Java все является объектом. А что нужно для объекта? Что есть у каждого объекта и определяет саму его суть?

— Класс объекта!

— Правильно! Молодец. У каждого объекта есть класс. Но вернемся к объектам. Некоторые объекты полностью содержат какую-то сущность, другие же просто помогают ей управлять.

Ко вторым можно отнести FileOutputStream или Thread. Когда ты создаешь объект Thread, новая нить не создается. Ее создает Java-машина после вызова метода start(). Этот объект просто помогает управлять процессом.

Так же и FileOutputStream: файл хранится на диске и его хранением и доступом к нему управляет ОС. Но мы можем взаимодействовать с ним посредством объектов типа File, при опять-таки помощи Java-машины.

— Да, я это понял уже.

— Так вот, для взаимодействия с классами есть специальный класс и называется он — Class.

— Не трудно было догадаться.

— Ага. Каждый раз, когда Java-машина загружает в память новый класс, она создает объект типа Class, посредством которого можно получить некоторую информацию о загруженном классе.

К каждому классу и объекту привязан такой «объект класса».

Пример Описание
Class clazz = Integer.class;
Получение «объект класса» у класса Integer.
Class clazz = int.class;
Получение «объект класса» у класса int.
Class clazz = "123".getClass();
Получение «объект класса» у объекта типа String.
Class clazz = new Object().getClass();
Получение «объект класса» у объекта типа Object.

— Ух ты, как интересно.

А почему ты пишешь clazz, а не class?

— А ты помнишь, что слово class – это ключевое слово в Java и использовать его для именования переменных нельзя?

— Да, я это знаю, знаю. Только забыл.

— Ты где-нибудь уже использовал объект Class?

— Да, мы использовали его, когда писали свою реализацию метода equals.

— Да, можно сравнить – одинаковые ли у объектов классы, если воспользоваться методом getClass().

— А что можно делать с этим объектом?

— Ну, много чего:

Код на Java Описание
Class s = int.class;
String name = s.getName();
Получить имя класса.
Class s = Class.forName("java.lang.String");
Получить класс по имени.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Сравнить классы у объектов.

— Интересно, но не так круто, как я думал.

— Хочешь, чтобы было круто? Есть еще Reflection. Reflection – это очень круто.

— А что такое Reflection?

Reflection – это способность класса получить информацию о самом себе. В Java есть специальные классы: Field – поле, Method – метод, по аналогии с Class для классов. Т.к. объект типа Class дает возможность получить информацию о классе, то объект типа Field–получить информацию о «поле класса», а Method–о «методе класса». И вот что с ними можно делать:

Код на Java Описание
Class[] interfaces = List.class.getInterfaces();
Получаем список «объектов класса» для интерфейсов класса List
Class parent = String.class.getSuperclass();
Получаем «объект класса» родительского класса для класса String
Method[] methods = List.class.getMethods();
Получаем список методов, которые есть у класса List
String s = String.class.newInstance();
Создаем новый объект класса String
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Получаем метод length у класса String, вызываем его у строки s

— Вау! Вот это реально круто!

— Рад, что тебе понравилось.