Shapeless 是否使用反射,在 Scala 生产代码中使用是否安全?

Does Shapeless use reflection and is it safe to use in scala production code?

看了很多文章,我对scala Shapeless 库还是有点迷糊。 Shapeless 似乎使用了 scala 编译功能?那么它是否使用反射,生产代码安全吗?

Shapeless 不使用反射,它使用宏来检查 类 的结构。对于 Shapeless,这种检查发生在编译时而不是运行时(反射发生在运行时)。由于这种 Shapeless 可以被认为比反射更安全,因为它能够在编译时进行许多检查。

让我们尝试使用 shapeless 按名称获取字段

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

如果我们使用无效的字段名称,编译器会报错并报错

另一方面,如果我们尝试使用反射来实现相同的目的,则会在运行时(可能在生产中)检查字段名称,这就是为什么反射不像 Shapeless 那样安全。使用 Shapeless 也会比反射快得多