繁体   English   中英

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

[英]What type of object is the ReferenceType in an instanceof RelationalExpression?

在实践中,Java期望对象用于其大部分语义的输入和输出,无论是原始类型还是实际对象,但不包括诸如类型名称,参数列表和返回类型之类的类元数据

作为一种固有的OOP语言,无论是否将所有内容都存储为对象,所有内容都被视为抽象级别的对象

因此,我想知道,生产中的ReferenceType是什么样的对象RelationalExpression(instanceof)

例如,在以下表达式中:

object instanceof ReferenceType

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

在实践中,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的右侧操作数必须是类型名称。

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM