getclass java что возвращает

Методы объектов Java: getClass()

Вступление

Эта статья является продолжением серии статей, описывающих часто забываемые методы базового класса объектов языка Java. Ниже приведены методы базового объекта Java, присутствующие во всех объектах Java из-за неявного наследования объекта, а также ссылки на каждую статью этой серии.

Метод getClass()

Основное различие в семантике использования getClass() по сравнению с другими Объектными методами заключается в том, что getClass() нельзя переопределить, поскольку он объявлен как окончательный метод.

Для чего хорош объект класса?

Отражение позволяет выполнять две основные задачи: (i) исследование объектов и их содержимого во время выполнения и (ii) динамический доступ к полям и выполнение методов во время выполнения.

Примером этого является возможность использовать отладчики в среде IDE, такой как Eclipse и Netbeans, для просмотра членов и их значений в классе во время выполнения программы.

Возьмем, к примеру, следующее:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Будет выведено следующее:

Опять же, ни один немазохист, вероятно, никогда не сделал бы этого в обычном повседневном программировании, но вы увидите, что подобные вещи часто делаются в рамках.

Вывод

В этой статье я описал значение и использование таинственного getClass() метода класса объектов Java. Я показал, как его можно использовать для получения метаданных экземпляра класса, таких как имя класса объекта во время выполнения, а также объяснил, почему может быть полезен доступ к экземпляру класса.

Как всегда, спасибо за чтение и не стесняйтесь комментировать или критиковать ниже.

Источник

Класс Object

В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив.

В таком виде объект обычно не используют. Чтобы с объектом что-то сделать, нужно выполнить приведение типов.

У класса есть несколько важных методов.

Методы getClass(), notify(), notifyAll(), wait() являются финальными и их нельзя переопределять.

Метод hashCode()

Для вычисления хеш-кода в классе String применяется следующий алгоритм.

У любого объекта имется хеш-код, определяемый по умолчанию, который вычисляется по адресу памяти, занимаемой объектом.

Значение хеш-кода возвращает целочисленное значение, в том числ и отрицательное.

Если в вашем классе переопределяется метод equals(), то следует переопределить и метод hashCode().

Метод toString()

Очень важный метод, возвращающий значение объекта в виде символьной строки.

Очень часто при использовании метода toString() для получения описания объекта можно получить набор бессмысленных символов, например, [I@421199e8. На самом деле в них есть смысл, доступный специалистом. Он сразу может сказать, что мы имеем дело с одномерным массивом (одна квадратная скобка), который имеет тип int (символ I). Остальные символы тоже что-то означают, но вам знать это не обязательно.

Если же вам нужно научное объяснение, то метод работает по следующему алгоритму (из документации).

Обычно принято переопределять метод, чтобы он выводил результат в читаемом виде.

Источник

Я думаю, почти любого Java разработчика когда-то спрашивали на собеседовании: «Какие есть методы у класса Object?»
Меня, по крайней мере, спрашивали неоднократно. И, если в первый раз это было неожиданностью (кажется, забыл про clone), то потом я был уверен, что уж методы Object’а-то я знаю;)

И каково же было мое удивление, когда спустя несколько лет разработки я наткнулся на собственное незнание сигнатуры метода getClass()

Итак, у нас есть класс А и объект этого класса a:

0. A.class vs a.getClass()

Начнем с простого. При вызове getClass() может отработать полиморфизм, и результатом будет класс-потомок.

Тут была ложь, на которую мне указали в комментариях. class — это не статическое поле, коим может показаться (и даже не нативное-псевдо-статическое поле, как думал я), а особая конструкция языка. И, в отличие от статического поля, обратиться к нему через объект нельзя!

Но это так, цветочки. Идем дальше.

1. А что такое этот ваш Class?

A.class — объект класса Class. Смотрим в Class.java:

Если подумать, то понятно зачем это нужно: теперь, в частности, можно написать метод, который возвращает произвольный тип, в зависимости от аргумента:

A.class возвращает объект класса Class:

2. А что же возвращает a.getClass()?

Собрав воедино все вышесказанное, можно догадаться, что:

Читайте также:  какой нации моргенштерн алишер

Действительно, ввиду полиморфизма нужно не забывать, что фактический класс объекта a — не обязательно A — это может быть любой подкласс:

3. А что же написано в Object.java?

Все эти дженерики — это, конечно, замечательно, но как записать сигнатуру метода getClass синтаксисом java в классе Object?
А никак:

А на вопрос, почему не компилировался пример выше, ответит Максим Поташев джавадок к методу:

The actual result type is Class where |X| is the erasure of the static type of the expression on which getClass is called.

Источник

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

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

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

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

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

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

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

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

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

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

Пример Описание
Получение «объект класса» у класса Integer.
Получение «объект класса» у класса int.
Получение «объект класса» у объекта типа String.
Получение «объект класса» у объекта типа Object.

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

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

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

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

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

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

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

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

Код на Java Описание
Получить имя класса.
Получить класс по имени.
Сравнить классы у объектов.

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

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

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

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

Источник

Java Blog

Методы класса Object в Java

Класс Object является корнем иерархии классов. У каждого класса есть Object как суперкласс. Все объекты, включая массивы, реализуют методы этого класса.

Методы класса Object

Метод getClass()

Метод getClass() возвращает:

Объект Class, представляющий класс времени исполнения (runtime class) этого объекта.

Метод hashCode

Возвращает значение хэш-кода для объекта. Этот метод поддерживается для использования хэш-таблиц, таких как те, что предоставляются HashMap.

Основной контракт метода hashCode:

Насколько это практически целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования Java.)

Метод hashCode возвращает:

Целочисленное (int) значение хэш-кода для этого объекта.

Метод equals

Указывает, равен ли какой-либо другой объект этому объекту.

Метод equals реализует отношение эквивалентности для ненулевых ссылок на объекты:

Метод equals для класса Object реализует максимально различающее возможное отношение эквивалентности на объектах; то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true только тогда, когда x и y ссылаются на один и тот же объект (x == y имеет значение true).

Читайте также:  с каким цветом сочетается теплый серый в интерьере

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда метод equals переопределяется, чтобы поддерживать общий контракт для метода hashCode, в котором говорится, что равные объекты должны иметь одинаковые хэш-коды.

Метод equals возвращает:

Значение true, если этот объект совпадает с аргументом obj; false в противном случае.

Метод clone

Создает и возвращает копию этого объекта. Точное значение «копия» может зависеть от класса объекта. Общее намерение состоит в том, что для любого объекта x, выражение:

будет верно, и это выражение:

будет верно, но это не абсолютные требования. Хотя обычно это так:

будет верно, это не является абсолютным требованием.

По соглашению, возвращаемый объект должен быть получен путем вызова super.clone. Если класс и все его суперклассы (кроме Object) подчиняются этому соглашению, это будет иметь место в том случае, если x.clone().getClass() == x.getClass().

По соглашению объект, возвращаемый этим методом, должен быть независимым от этого объекта (который клонируется). Для достижения этой независимости может потребоваться изменить одно или несколько полей объекта, возвращаемого super.clone, перед его возвратом. Как правило, это означает копирование любых изменяемых объектов, которые составляют внутреннюю «глубокую структуру» клонируемого объекта, и замену ссылок на эти объекты ссылками на копии. Если класс содержит только примитивные поля или ссылки на неизменяемые объекты, то обычно бывает так, что нет необходимости изменять поля в объекте, возвращаемом super.clone.

Класс Object сам по себе не реализует интерфейс Cloneable, поэтому вызов метода clone для объекта, класс которого Object, приведет к возникновению исключения во время выполнения.

Метод clone возвращает:

клон этого экземпляра.

Метод clone выбрасывает:

Метод toString

Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая является «текстовым представлением» этого объекта. Результатом должно быть краткое, но информативное представление, которое легко читается человеком. Рекомендуется, чтобы все подклассы переопределяли этот метод.

Метод toString для класса Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символа знака «@» и шестнадцатеричного представления без знака хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

Метод toString возвращает:

строковое представление объекта.

Метод notify

Пробуждает один поток, который ожидает на мониторе этого объекта. Если какие-либо потоки ожидают этого объекта, один из них выбирается для пробуждения. Выбор является произвольным и происходит на усмотрение реализации. Поток ожидает на мониторе объекта, вызывая один из методов wait.

Пробужденный поток не сможет продолжить работу, пока текущий поток не снимет блокировку этого объекта. Пробужденный поток будет конкурировать обычным образом с любыми другими потоками, которые могут активно конкурировать за синхронизацию на этом объекте; например, пробужденный поток не имеет надежных привилегий или недостатков в качестве следующего потока для блокировки этого объекта.

Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта. Поток становится владельцем монитора объекта одним из трех способов:

Только один поток одновременно может владеть монитором объекта.

Метод notifyAll

Пробуждает все потоки, которые ожидают на мониторе этого объекта. Поток ожидает на мониторе объекта, вызывая один из методов wait.

Пробужденные потоки не смогут продолжить работу, пока текущий поток не снимет блокировку этого объекта. Пробужденные потоки будут конкурировать обычным образом с любыми другими потоками, которые могут активно конкурировать за синхронизацию на этом объекте; например, пробужденные потоки не имеют надежных привилегий или недостатков в качестве следующего потока для блокировки этого объекта.

Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта.

Метод wait с аргументом timeout

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта, или пока не истечет указанное количество времени.

Текущий поток должен владеть монитором этого объекта.

Этот метод заставляет текущий поток (назовем его T) поместить себя в набор ожидания для этого объекта, а затем отказаться от любых заявлений на синхронизацию этого объекта. Поток T становится отключенным для целей планирования потоков и остается бездействующим, пока не произойдет одно из четырех:

Затем поток T удаляется из набора ожидания для этого объекта и снова включается для планирования потока. Затем он конкурирует обычным образом с другими потоками за право синхронизации на объекте; как только он получил контроль над объектом, все его заявки на синхронизацию с объектом восстанавливаются до состояния quo ante, то есть ситуации на момент вызова метода wait. Затем поток T возвращается из вызова метода ожидания. Таким образом, при возврате из метода ожидания состояние синхронизации объекта и потока Т точно такое же, как и при вызове метода ожидания.

Читайте также:  что делать в юар

Поток также может просыпаться без уведомления, прерывания или истечения тайм-аута, так называемое ложное пробуждение (spurious wakeup). Хотя это редко случается на практике, приложения должны защищаться от него, проверяя условие, которое должно было вызвать пробуждение потока, и продолжая ждать, если условие не выполняется. Другими словами, ожидания всегда должны происходить в циклах, например:

Если текущий поток прерывается каким-либо потоком до или во время ожидания, генерируется исключение InterruptedException. Это исключение не выдается, пока состояние блокировки этого объекта не будет восстановлено, как описано выше.

Обратите внимание, что метод wait, поскольку он помещает текущий поток в набор ожидания для этого объекта, разблокирует только этот объект; любые другие объекты, по которым текущий поток может быть синхронизирован, остаются заблокированными, пока поток ожидает.

Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта.

Метод wait с аргументами timeout и nanos

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта, или какой-либо другой поток прервет текущий поток, или пока не истекло определенное количество реального времени.

Этот метод аналогичен методу wait с одним аргументом, но он позволяет лучше контролировать время ожидания уведомления перед тем, как отказаться. Количество реального времени, измеряемое в наносекундах, определяется как:

Во всех других отношениях этот метод делает то же самое, что и метод wait(long) с одним аргументом. В частности, wait(0, 0) означает то же самое, что и wait(0).

Текущий поток должен владеть монитором этого объекта. Поток освобождает владельца этого монитора и ожидает, пока не произойдет одно из следующих двух условий:

Затем поток ожидает, пока не получит право собственности на монитор, и возобновит выполнение.

Как и в версии с одним аргументом, возможны прерывания и ложные пробуждения, и этот метод всегда должен использоваться в цикле:

Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта.

Метод wait без аргументов

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта. Другими словами, этот метод ведет себя точно так же, как если бы он просто выполнял вызов wait(0).

Текущий поток должен владеть монитором этого объекта. Поток освобождает владельца этого монитора и ожидает, пока другой поток не уведомит потоки, ожидающие на мониторе этого объекта, чтобы он проснулся либо посредством вызова метода notify, либо метода notifyAll. Затем поток ожидает, пока не получит право собственности на монитор, и возобновит выполнение.

Как и в версии с одним аргументом, возможны прерывания и ложные пробуждения, и этот метод всегда должен использоваться в цикле:

Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта.

Метод finalize

Вызывается сборщиком мусора на объекте, когда сборщик мусора определяет, что больше нет ссылок на объект. Подкласс переопределяет метод finalize для удаления системных ресурсов или для другой очистки.

Метод finalize класса Object не выполняет никаких специальных действий; он просто выполняет возврат. Подклассы Object могут переопределить это поведение.

Язык программирования Java не гарантирует, какой поток вызовет метод finalize для любого данного объекта. Однако гарантируется, что поток, который вызывает finalize, не будет удерживать видимые пользователем блокировки синхронизации, когда вызывается finalize. Если с помощью метода finalize генерируется неперехваченное исключение, оно игнорируется, и финализация этого объекта завершается.

После того, как метод finalize был вызван для объекта, никакие дальнейшие действия не предпринимаются, пока виртуальная машина Java снова не определит, что больше нет никаких средств, с помощью которых этот объект мог бы быть доступен любому потоку, который еще не жив, включая возможные действия другими объектами или классами, которые готовы к финализации, после чего объект может быть удален.

Метод finalize никогда не вызывается виртуальной машиной Java более одного раза для любого данного объекта.

Любое исключение, выброшенное методом finalize, приводит к остановке завершения этого объекта, но в противном случае игнорируется.

Источник

Сказочный портал