Какой тип объекта является ReferenceType в экземпляре RelationalExpression? - PullRequest
0 голосов
/ 19 мая 2018

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

Будучи по сути языком ООП, все рассматривается как объект на абстрактном уровне, независимо от того, хранится ли все как объект в памяти

Итак, мне было интересно, какой тип объекта является ReferenceType в производстве, RelationalExpression (instanceof) ?

Например, в следующем выражении:

object instanceof ReferenceType

Я хочу знать, является ли ReferenceType фактическим объектом или нет, и если нет, то как он представлен JVM согласнок спецификации JVM как байт-код и как он функционирует?

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

ReferenceType является символьной ссылкой.instanceof имеет соответствующую инструкцию instanceof indexbyte1 indexbyte2 в соответствии со Спецификацией виртуальной машины Java (Java 10).Два байта индекса могут быть построены в 32-разрядное (без знака) целое число, которое является индексом пула констант времени выполнения текущего класса.

Objectref, который должен иметь ссылку на тип, извлекается изстек операндов.Беззнаковые indexbyte1 и indexbyte2 используются для создания индекса в пуле постоянных времени выполнения текущего класса (§2.6), где значение индекса равно (indexbyte1 << 8) |indexbyte2.Элемент пула констант во время выполнения в индексе должен быть символической ссылкой на класс, массив или тип интерфейса. </p>

Где objectref - ссылка на левый объект в выражении instanceof.

Символьная ссылка разрешается, если objectref не равен NULL, и тип objectref сравнивается с разрешенным типом, чтобы определить, является ли objectref экземпляром ReferenceType:

Если objectrefимеет значение null, инструкция instanceof помещает результат int, равный 0, как int в стек операндов.

В противном случае разрешается именованный класс, массив или тип интерфейса (§5.4.3.1).Если objectref является экземпляром разрешенного класса или типа массива или реализует разрешенный интерфейс, инструкция instanceof помещает результат int, равный 1, как int в стек операндов;в противном случае он возвращает результат int, равный 0.

0 голосов
/ 19 мая 2018

На практике Java ожидает объект для ввода и вывода для всего,

Ну, нет, это завышение.Даже если мы исключим элементы синтаксиса, такие как знаки препинания и ключевые слова, в Java есть значения примитивного типа.И у него есть имена типов.

и, будучи неотъемлемо языком ООП, все рассматривается как объект,

Вы попадаете в неприятности, беспечно разбрасываясь вокругслово «все».Я думаю, вы пытаетесь утверждать, что на языке ОО все данные представлены внутри программы объектами.По крайней мере, это наиболее правдоподобная интерпретация, которую я могу достичь, и на самом деле это верно для некоторых ОО-языков (SmallTalk, Ruby, ...), но не для Java.

, поэтому мне было интереснокакого типа объект является ReferenceType в производстве, RelationalExpression (instanceof)?

Это не объект.Это имя типа.

Как оно представлено в JVM во время выполнения?

Мне бы пришлось проверить, чтобы быть уверенным, но весьма вероятно, что оно представленоссылка на пул констант класса, в котором появляется выражение.

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

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

Является ли это «метаобъектом», который представляет только реальный тип или класс,

Язык Java не имеет понятия «мета-объект», по крайней мере, в отличие от объектов типа java.lang.Class.Но объекты типа Class все еще являются объектами, и ссылки на них не подходят для использования в качестве правого операнда выражений instanceof.Правый операнд должен быть именем типа.

, и почему разработчики Java не разрешают передавать объект Class вместо ReferenceType, или я имею в виду неправильную парадигму для instanceof?

Я не могу авторитетно говорить о мотивах дизайнеров Java, не будучи одним из них.Однако я замечаю, что Class.isInstance(), доступный после Java 1.1, служит для той же цели, что и ссылка на Class, как это сделал бы правый операнд выражения instanceof.

Правый операнд instanceof должен быть именем типа.

...