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)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
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 Уровень 36
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 Уровень 40
18 мая 2024
18.05.2024
Ислам Уровень 33
21 февраля 2024
Кстати, такой формат лекций намного более интересней
Ислам Уровень 33
21 февраля 2024
Но также стоит помнить что рефлексия требует немало вычислительных ресурсов
JavaRusher853 Уровень 36
8 сентября 2024
Неужели после 30 левела ты поумнел и перестал спамить nice?
Mikhail Tabakaev Уровень 31
9 октября 2024
nice comment 😂