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