什么是运行时保留注释的scala替代方法

Boz*_*zho 13 scala

我刚刚意识到我在scala中没有注释,这些注释在运行时被保留和分析.我也检查了这个问题,但我没有完全了解它的替代方案.

  • DI - 答案提到scala中不需要DI框架.虽然在基本层面上可能就是这种情况(虽然我不太喜欢这个例子 ;处理DI的惯用方法是什么?),像Spring这样的Java DI框架非常先进,可以处理许多事情,比如预定的工作,缓存,托管持久性等,通过注释,有时 - 自定义的.

  • ORM - 我承认我没有尝试任何原生的scala ORM,但是从我在squeryl中看到的,它也使用了注释,这意味着它们是不可避免的?

  • 任何序列化工具 - 如何习惯性地将序列化输出自定义为JSON/XML/...?

  • Web服务框架 - 如何定义(在代码中)RESTful或SOAP服务的映射,标头等?

Scala用户需要使用混合scala/java(用于注释)项目才能使用来自Java的这些工具?

元数据的原生scala替代品是否比注释更好?我还没有完全进入scala思维模式,因此与使用注释相比,大多数示例对我来说都很难看,所以请尽量让人更有说服力:)

ghi*_*hik 8

实际上,Scala 确实有运行时保留的注释.不同之处在于它们不是作为Java注释存储的,而是在二进制ScalaSignature注释的内容中编码(其本身是运行时保留的Java注释).

因此,可以在运行时检索Scala注释,但不必使用Java反射,必须使用Scala反射:

class Awesome extends StaticAnnotation

@Awesome
class AwesomeClass

import scala.reflect.runtime.universe._

val clazz = classOf[AwesomeClass]
val mirror = runtimeMirror(clazz.getClassLoader)
val symbol = mirror.classSymbol(clazz)
println(symbol.annotations) // prints 'List(Awesome)'
Run Code Online (Sandbox Code Playgroud)

不幸的是,Scala反射仍然标记为实验,并且此时实际上是不稳定的(SI-6240SI-6826是相当严重的问题的例子).然而,从长远来看,它似乎是Java反射和注释最直接的替代品.

至于现在,必须使用Java注释,我认为这仍然是一个很好的解决方案.

关于DI/ORM/WS /序列化的框架和库 - Scala在这方面似乎还不成熟,至少不像Java那样成熟.有很多针对这些问题的正在进行的项目,其中一些已经非常好,另一些仍处于开发阶段.仅举几例浮现在我的脑海里:Squeryl,油滑,喷涂,酸洗.

此外,Scala还有一些高级功能,通常不需要注释.类型(用隐式参数实现)可能是很好的例子.