Метод getClass

Модуль 2. Java Core
9 уровень , 5 лекция
Открыта
Метод 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

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

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

12
Задача
Java Core, 9 уровень, 5 лекция
Недоступна
Четные символы
Считать с консоли 2 имени файла. Вывести во второй файл все символы с четным порядковым номером (нумерация начинается с 1). Пример первого файла: text in file Вывод во втором файле: eti ie Закрыть потоки ввода-вывода.
20
Задача
Java Core, 9 уровень, 5 лекция
Недоступна
Считаем слово
Считать с консоли имя файла. Файл содержит слова, разделенные знаками препинания. Вывести в консоль количество слов "world", которые встречаются в файле. Закрыть потоки.
20
Задача
Java Core, 9 уровень, 5 лекция
Недоступна
Выделяем числа
Считать с консоли 2 пути к файлам. Вывести во второй файл все целые числа, которые есть в первом файле (54у не является числом). Числа выводить через пробел. Закрыть потоки.
12
Задача
Java Core, 9 уровень, 5 лекция
Недоступна
Замена знаков
Считать с консоли 2 имени файла. Первый Файл содержит текст. Считать содержимое первого файла и заменить все точки "." на знак "!". Результат вывести во второй файл. Закрыть потоки.
12
Задача
Java Core, 9 уровень, 5 лекция
Недоступна
Пунктуация
Считать с консоли 2 имени файла. Первый Файл содержит текст. Считать содержимое первого файла, удалить все знаки пунктуации, включая символы новой строки. Результат вывести во второй файл. Закрыть потоки.
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Руслан Уровень 48
3 октября 2025
рефлексия вообще пушка!!
Игорь Уровень 66
6 апреля 2025
Если не понятен здесь материал, копируйте код в IntelliJ IDEA, запускайте и System.out.println все покажет. И конечно же для массивов применяем Arrays.toString(...)))) Например Method[] methods = List.class.getMethods(); System.out.println(Arrays.toString(methods)); и получаем кучу методов интерфейса List: [public abstract boolean java.util.List.remove(java.lang.Object), public abstract java.lang.Object java.util.List.remove(int),......
Артем Иевлев Уровень 115
26 ноября 2024
А ведь Class еще и дженерализуется😭
Олег Уровень 111 Expert
30 сентября 2024
Крайний пример кода можно изменить:

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        /* Метод newInstance() в классе Class создаёт новый объект
        с помощью вызова конструктора по умолчанию (без параметров).
        Однако, у класса String нет конструктора без параметров,
        и вызов newInstance() в данном случае
        вызовет исключение InstantiationException.
        Для создания строки можно использовать конструкторы с параметрами
        или вызвать статический метод, такой как valueOf().
        Заменим вызов String.class.newInstance()
        на простое создание строки "Hello, World!" */
        
        String s = "Hello, World!";
        
        // Получаем метод length() у класса String
        Method m = String.class.getMethod("length");
        
        /* Вызываем метод length() для объекта строки s
        Результат приводим к типу int,
        так как метод возвращает целочисленное значение. */
        
        int length = (int) m.invoke(s);
        
        // Выводим длину строки
        System.out.println("Длина строки: " + length);  // Output: Длина строки: 13
    }
}

Андрей Уровень 101 Expert
11 января 2023
— Ты где-нибудь уже использовал объект Class? — Да, мы использовали его, когда писали свою реализацию метода equals. instanceof там использовали
Андрей Уровень 2
25 декабря 2024
Да, instanceof был. Пиздаболы несчастные
Владимир Уровень 109 Expert
11 июня 2022
Амиго, какая-то токсичная скотина: "Да, я это понял уже", "Не трудно было догадаться", "Интересно, но не так круто, как я думал".
Артем Уровень 48
5 марта 2025
Подобные мысли и меня посещают когда читаю реплики Амиго)))
Андрей Пазюк Уровень 117 Expert
28 мая 2022
Надеюсь в работе эта штука не применяется, иначе я уйду "программировать" на HTML.
Сергей Уровень 111 Expert
17 июля 2022
Не встречалось больше это всё?:)
Андрей Пазюк Уровень 117 Expert
17 июля 2022
Сергей, было. Вещь действительно полезная, к тому же уже давно ее изучил и не парюсь больше.
Евгений Уровень 44
23 августа 2022
а где изучил?) Скинь ссыль)
Михаил Уровень 102 Expert
30 августа 2022
на JR скорее всего ))
Александр Уровень 39 Expert
24 декабря 2023
Присоединяюсь к поискам.