Java instanceof运算符是否被视为反射,反射的定义是什么?


24

我今天与同事讨论了使用Java运算符的使用是否instanceof是一种反思。讨论很快演变成实际定义反射的内容。

那么,反射的定义是什么?

instanceof认为使用了“使用反射”吗?

另外,如果instanceof将其视为反射,那么多态性还不是“利用反射”吗?如果没有,有什么区别?


4
您已经回答了您自己的问题。如何定义“反射”确定是否instanceof是反射的示例。当然,它介于通过getClass()&朋友使用常规数据和使用元数据之间,但您可以通过一些方式使用可行的定义。
Kilian Foth 2011年

使用的return是“结构编程”吗?
SF。

Answers:


22

根据维基百科,是反射的定义:

在计算机科学中,反射是计算机程序可以观察(进行类型自省)并在运行时修改其自身的结构和行为的过程。

我自己不能说得更好,并强调了您问题的重要部分。就是说,instanceof可以考虑使用反射。该程序观察其结构并进行类型自省


3
@Steven Jeuris:区别在于if (true),而不看类型。这就是为什么它不被认为是反思。
sleske 2011年

1
@sleske:之所以提到它,是因为观察类型是一项基本的原则。没有它,就不会有多态性。从技术上讲,这意味着简单的替代也可以视为反射(或至少会导致)。不要忘记定义的第二部分:在运行时修改其自身的结构和行为。总而言之,我赞成这个答案(请检查我的第二条评论),但我确实了解OP的问题来自何处。; p
Steven Jeuris 2011年

1
根据反射的定义,正常的多态性也不也是一种反射吗?
Bjarke Freund-Hansen

4
@bjarkef:我会说“不”,因为多态性使用的虚拟调度是由语言本身隐式完成的,而不是由应用程序代码明确检查相关对象以识别其特征。
Dave Sherohman 2011年

2
@Dave Sherohman:我还要补充一点,大部分工作(设置跳转表等)都是在编译时完成的,而不是在运行时完成的。
TMN

13

为了清楚起见,我将考虑两个答案。

从理论上讲instanceof是反射的一种形式,如Falcon的回答所述

在计算机科学中,反射是计算机程序可以观察(进行类型自省)并在运行时修改其自身的结构和行为的过程。

但是,实际上,当程序员谈论使用反射时,他通常指的不仅仅是检查变量是否属于某种类型。这是一个非常基本的概念,没有它,多态是不可能的

请注意,instanceof经常使用表示代码有气味,通常可以使用适当的多态来代替。


1
+1的电位码气味-并非总是如此,只是潜在的
加里·罗


2

由于其他答案,Wikipedia中的定义已更改(我碰巧同意这一更改,但我不是这样做的人)以删除括号中的部分:

在计算机科学中,反射是计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。

https://en.wikipedia.org/wiki/Type_introspection也专门说

内省不应与反思相混淆

我不会考虑instanceof到属于第一种定义下:程序检查一个值,而不是它自己的结构,它不涉及表示节目结构(在Java中:任何值java.lang.Classjava.reflect.Method等); 反思的标志就是运用这样的价值观。


-5

是的,“ instanceof”运算符是一种反射形式。先前的答案告诉您原因。

如今,“反射”或“对象/类的自省”是一种炒作,但是从某种程度上讲,几种编程语言已经使用了这种概念。

DOT NET(Java克隆)使用的(很多)。


1
u,老兄?
康拉德·鲁道夫

3
您的第一句话是正确的,在前面的答案面前是多余的。其余的只是错误的。
Frank Shearar 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.