当我开始使用Lift时,我有点惊讶于它如此大量地使用反射(或似乎如此),这在静态类型的函数式语言中有点出乎意料。我使用JSP的经历与此相似。
我对web开发很陌生,所以我真的不知道这些工具是如何工作的,但是我想知道,
-
web开发的哪些方面鼓励使用反射?
-
是否有任何工具(在静态类型语言中)处理(1)从模板页面引用代码(2)对象关系映射,以不使用反射的方式?
请参阅升降机来源。我所研究的大多数代码都没有使用反射。几乎所有东西都是静态类型的。如果您指的是升降机视图,它们被处理为Xml节点,那也不是反射。
特指<lift:Foo.bar/>
问题:
当代码中遇到<lift:Foo.bar/>
时,Lift会猜测原始名称应该是什么(不同的命名约定),然后调用java.lang.Class.forName
来获得该类。(相关代码见LiftSession.scala
、ClassHelpers.scala
)它只会找到在启动期间注册在addToPackages
的类。
注意,手动注册类和方法也是可能的(也是常见的)。惯例仍然是所有的转换必须是NodeSeq => NodeSeq
的形式,因为这是唯一对无类型的HTML/XHTML输出有意义的东西。
因此,您拥有的是Lift的节点转换的内部注册表,而在另一边是模块的隐式注册表。这两种类型都使用简单的字符串查找来执行方法。我想这是有争议的,如果一个更基于反射比另一个。