是否可以无形地反射,并且在Scala生产代码中使用安全吗?



阅读了许多文章后,我仍然对Scala无形库感到有些困惑。似乎无形使用Scala编译功能?那么它是否使用反射,并且对生产代码安全吗?

无形不使用反射,它使用宏来检查类的结构。通过无形,此检查在编译时进行,而不是运行时发生(反射在运行时发生(。由于这种无形,可以认为比反射更安全,因为它可以在编译时进行许多检查。

让我们尝试使用无形的

来获取字段
case class MyClass(field: String)
import shapeless._
val myClassLens = lens[MyClass] >> 'field
val res = myClassLens.get(MyClass("value")) // res == "value"

如果我们使用无效字段名称,则编译器将对编译错误抱怨

另一方面,如果我们尝试使用反射来实现同样的事情,则将在运行时(也许在生产中(检查字段名称,这就是为什么反射不像无形的那样安全的原因。与反射相比,它的速度也将比反射

更快

最新更新