为什么面向对象语言必须实现Reflection类

248 阅读2分钟

在Java中通过ava.lang.class提供反射功能。

在JS中通过Reflect提供反射功能。

Java是面向对象的语言,近些年ES的发展也是取面向对象的优点,发展基于对象的语言----JS。

一直无法理解为什么在面向对象语言(不单指哪一个具体的语言)中为什么一定有反射的功能。

今天偶然有些想法,不一定对。

我们将面向对象语言编程时看做两部分,一部分是程序员编写的代码本身,另一部分是运行该语言的虚拟机。每种语言都有固定的语法,但是随着历史发展,语言诞生之初制定的语法规则随着发展逐渐无法满足人们的需求,有时候就需要制定一些特殊的规则,但是这些规则可能和之前的语法规则相矛盾,怎么办呢?无疑,肯定是新增规则,而不可能是修改之前的规则适应当今的需求。

假设有一种特殊的语法,不遵循约定俗成的作用域规则,我们本应该在此处能够访问该对象,可是该语法不允许。这样一来我们程序员的手怎么伸到想要的对象身上呢?

假设我直接可以站在虚拟机的角度要这个对象就好了,不站在你约定的语法层面。好吧,事实上,每种面向对象的语言都在虚拟机上为我们开了后门,就是反射,只要虚拟机认识的对象,你都可以拿去用。

反射很强大,但是最好只在应该使用的时候去使用反射。因为反射站在虚拟机的角度创建的语法,是可以在运行时修改对象的。另一方面,按照约定的语法规则让引擎静态编译代码,其可读性远比动态编译要好得多。