反射并不好(也好)
大概是通过字符串调用相关的函数或者类,并且这个字符串和函数或类的名字一模一样。这样并不好。
编程语言中可识别的字符都是给人看的,为了编码方便。在编译的时候这些字符都是临时性引用,会被替换成相应简易的数字。这种替换增加了编译的灵活性,也给编程增加了一层“魔法”。
这就像定下了一条规则,函数或者类的名字不会影响到内部的运作机制。这样编译器就可以安心做好自己的事。它的逻辑渗透有一层保护壳,保证不会被外界打扰。
加入了反射就破坏了这层保护壳。使得编译器牵扯进一些归属于它职责之外的内容。这使得整个语言的健壮性令人堪忧。
就像一个人做事,抛弃了一直秉承的原则。
Java和C并不一样,C属于零凑型,java自身是一个整体。所有的类来自同一个继承等,它有一个统一的整体。C的话实现反射还说得过去,因为它本身就是“功能的拼凑”。可是java已经是一个整体,有它的一致性,所有操作不应该打破它建立的抽象层。
反射即是goto,在它面前没有“类”可言。随意的跳转打破了类和类之间的关联性,也打破了类对方法的聚合性,所有方法又变回了放在相应文件里的函数,并不再是对象的行为。
或许框架可以限制goto的范围,可是这种类名字符串回归真实空间的功能使用,会影响底层架构。
反射并不是健壮的发展方式。
编程语言可以有这个功能,并不代表可以被推崇。
补:
反射可以当作一种自动组装的配置文件。像web路由通过读取相关类和方法的名字,自动生成路由。也通过读取相应方法参数的名字,自动填充参数和转换类型。 从这个角度来看,反射相当于利用了元文件 符号文件,来自动配置一些参数。 于是并不像学习过程中使用到的那样,来破坏类结构。如果是站在自动完成配置文件的角度,反射的用处相当于一种高度自动化。 所以之前的观点还是过于狭隘了。