JavaRush /Курсы /Java Multithreading /Метод getClass(), объект класс, знакомство с Reflection

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

Java Multithreading
1 уровень, 11 лекция
Открыта
Метод 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

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

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

Комментарии (161)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
TimJohnzz Уровень 22
28 октября 2026
Не совру, если скажу, что возвращаться к обучению каждый день все труднее и труднее
Anonymous #3585174 Уровень 33
24 сентября 2025
Like
28 июня 2025
Очень полезные методы класса Class

// Информация о классе
String getName()          // Полное имя (java.lang.String)
String getSimpleName()    // Короткое имя (String)
Class<?> getSuperclass()  // Родительский класс

// Создание экземпляра
T newInstance()           // Устарел (deprecated)
Constructor<T> getConstructor() // Предпочтительный способ

// Рефлексия
Field[] getFields()       // Публичные поля (включая наследованные)
Field getDeclaredField()  // Любое поле класса (включая private)
Method[] getMethods()     // Публичные методы
Annotation[] getAnnotations() // Аннотации класса
No Name Уровень 22
20 ноября 2024
+ лекция в копилке
VAKHANDER Уровень 32
30 октября 2024
30.10.2024
FolFix Уровень 38
21 октября 2024
Рефлекcия - средство, которая может вывернуть класс наизнанку. Я получил власть, которая и не снилась моему отцу!
Solaire Уровень 42
26 июня 2024
Прошу заметить, что getMethods(), помимо того, что возвращает только public-методы, так он возвращает не только методы самого класса, но и методы родительского класса, а там уже и методы этого родительского класса и так далее. В таблице указано, что возвращаются только методы List, но это не так.
Virgilion Уровень 41
29 августа 2024
Так вроде как логично, если при наследовании наследуются и методы
Private Joker Уровень 36
14 июня 2024
Class FUass = getAss;
Максим Li Уровень 51
18 мая 2024
18.05.2024
Ислам Уровень 33
21 февраля 2024
Кстати, такой формат лекций намного более интересней