RelationalExpression实例中的ReferenceType是什么类型的对象?

时间:2018-05-19 15:06:54

标签: java semantics instanceof boolean-expression

实际上,Java期望一个对象用于输入和输出的大部分语义,无论是基本类型还是实际对象,排除类型名称,参数列表和返回类型等类元数据

本质上是一种OOP语言,无论是否所有内容都作为对象存储在内存中,所有内容都被视为一个对象

所以,我想知道,制作中的ReferenceType是什么类型的对象RelationalExpression (instanceof)

例如,在以下表达式中:

object instanceof ReferenceType

我想知道ReferenceType是否是实际对象,如果没有,JVM如何根据JVM规范将其表示为字节码以及它如何运作?

2 个答案:

答案 0 :(得分:2)

  

实际上,Java期望输入和输出的对象   的一切,

嗯,不,这是夸大其词。即使我们排除诸如标点符号和关键字之类的语法元素,Java也具有基本类型的值。它有类型名称。

  

并且,本质上是一种OOP语言,一切都是   被视为对象,

你快乐地抛出“一切”这个词,让自己陷入困境。我认为你试图断言,在OO语言中,所有数据都在对象内部表示。至少那是我能够达到的最接近合理的解释,事实上它对某些OO语言(SmallTalk,Ruby,......)都是正确的 - 但不是Java。

  

所以我想知道,是什么类型的对象   生产中的ReferenceType,RelationalExpression(instanceof)?

这不是一个对象。这是一个类型名称。

  

它在运行时如何在JVM中表示?

我必须检查以确定,但很可能它是由对表达式出现的类的常量池的引用表示的。

  

什么样的对象可以   如果通常使用类型,则传递给此表达式(如果有)   声明如类声明符或变量声明符?

instanceof表达式的右侧操作数是类型名称,实际上,它在类和变量声明符中使用。它既不是参考值也不是原始类型的值。

  是的吗?   一个“元对象”,只代表一个真实的类型或类,

Java语言没有“元对象”的概念,至少与java.lang.Class类型的对象不同。但是Class类型的对象仍然是对象,对它们的引用不适合用作instanceof表达式的右手操作数。右侧操作数必须是类型名称。

  

为什么   Java的开发人员是否不允许传递Class对象   一个ReferenceType,或者我在想错误的范例   的instanceof?

我不能权威地谈论Java设计师的动机,而不是其中之一。但是,我确实观察到,自Java 1.1以来可用的Class.isInstance()用于允许引用Class作为instanceof表达式的右手操作数的目的。

instanceof的右侧操作数必须是类型名称。

答案 1 :(得分:1)

ReferenceType是一个符号引用。根据Java虚拟机规范(Java 10),instanceof具有相应的instanceof indexbyte1 indexbyte2指令。可以将两个索引字节构造为一个32位(无符号)整数,该整数是当前类的运行时常量池的索引。

  

从操作数堆栈中弹出必须为引用类型的objectref。无符号的indexbyte1和indexbyte2用于在当前类的运行时常量池(第2.6节)中构造一个索引,其中索引的值为(indexbyte1 << 8)| | | | | | | | |。索引字节2。索引处的运行时常量池项必须是对类,数组或接口类型的符号引用。

其中objectref是instanceof表达式中的左侧对象引用。

如果objectref不为null,则解析符号引用,并根据解析的类型评估objectref的类型,以确定objectref是否为ReferenceType的实例:

  

如果objectref为null,则instanceof指令将推入int结果   0作为操作数堆栈上的int。

     

否则,将解析命名的类,数组或接口类型   (第5.4.3.1节)。如果objectref是已解析的类或数组的实例   输入或实现解析的接口instanceof指令   将int结果1作为int推入操作数堆栈;除此以外,   它将int结果推为0。