【问题标题】:What type of object is the ReferenceType in an instanceof RelationalExpression?RelationalExpression 实例中的 ReferenceType 是什么类型的对象?
【发布时间】:2018-10-29 19:14:26
【问题描述】:

在实践中,Java 的大部分语义都需要一个对象作为输入和输出,无论是原始类型还是实际对象,不包括类型名称、参数列表和返回类型等类元数据

本质上是一种 OOP 语言,所有东西都被视为抽象级别的对象,无论是否所有东西都作为对象存储在内存中

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

例如,在下面的表达式中:

object instanceof ReferenceType

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

【问题讨论】:

  • 我不太明白你在问什么:它是一个引用类型。就像public String foo() 中的String 是一个引用类型一样。
  • @AndyTurner 是的,我明白这一点,但我想我的问题是 ReferenceType 是什么类型的对象以及它是纯粹的元数据还是实际对象。
  • 它不是一个对象,也不是元数据。它只是一个类型的名称。
  • 那么ReferenceType只是ConstantPool中的一个运行时常量值吗?

标签: java semantics instanceof boolean-expression


【解决方案1】:

在实践中,Java 期望一个对象作为输入和输出 一切,

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

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

随便乱说“一切”这个词,你就会惹上麻烦。我认为您试图断言在 OO 语言中,所有 data 在程序内部都由对象表示。至少这是我能达到的最接近合理的解释,事实上某些 OO 语言(SmallTalk、Ruby 等)确实如此——但 Java 则不然。

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

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

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

我必须检查一下才能确定,但​​很可能它是通过对出现表达式的类的常量池的引用来表示的。

什么样的物体可以 被传递给这个表达式,如果有的话,如果通常使用一个类型 类声明符或变量声明符之类的声明?

instanceof 表达式的右侧操作数是一个类型名称,就像在类和变量声明符中使用的一样。它不是一个值,既不是引用也不是原始类型。

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

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

以及为什么 Java 的开发人员会不允许就地传递 Class 对象吗 ReferenceType 的,或者我是否在考虑错误的范式 实例?

我不能权威地谈论 Java 设计者的动机,我不是其中之一。不过,我确实注意到,Class.isInstance(),自 Java 1.1 起可用,其目的与允许引用 Class 作为 instanceof 表达式的右手操作数的目的相同。

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

【讨论】:

  • 我想故意省略传递 Class 对象或 ReferenceType 是 Java 语言设计的一部分,Class.isAssignableFrom() 确实有它的目的,但如果它被使用可与instanceof 互换,那么为什么不是Class.isSubclass(Class<?>)Class#instantiates(Object)?当然,除非这是无意的,开发人员不知何故忽略了RelationalExpression instanceof ClassLiteral 的可能性。
  • @LinkTheProgrammer,isSubclass 这个名称所隐含的行为与instanceofisAssignableFrom 在所讨论的类型是接口时的行为不同。
  • 使用Interface.isSubclass 仍然具有语义意义,因为接口本质上是一个抽象类,具有受保护的构造函数,没有具体的方法或声明的字段。
  • 你的目标是什么,@LinkTheProgrammer?我对争论 Java 设计者是否可以或应该在这个领域做出不同的选择不感兴趣。理性的人可以不同意。你问了一个关于instanceof 表达式的事实问题,我回答了。如果我的答案在某些方面不清楚,那么无论如何都欢迎要求澄清。
  • 等价于instanceof 将是Class.isInstance(…),而不是Class.isAssignableFrom(…)
【解决方案2】:

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

objectref 必须是引用类型,从操作数堆栈中弹出。无符号 indexbyte1 和 indexbyte2 用于构造当前类的运行时常量池的索引(第 2.6 节),其中索引的值为 (indexbyte1

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

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

如果objectref为null,instanceof指令推送一个int结果 0 作为 int 到操作数堆栈上。

否则,解析命名的类、数组或接口类型 (§5.4.3.1)。如果 objectref 是已解析类或数组的实例 类型,或实现解析的接口,instanceof指令 将 int 结果 1 作为 int 推入操作数堆栈;否则, 它推送一个 0 的 int 结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2014-09-04
    • 2020-04-16
    • 2017-11-20
    相关资源
    最近更新 更多