【问题标题】:Does Shapeless use reflection and is it safe to use in scala production code?Shapeless 是否使用反射,在 scala 生产代码中使用是否安全?
【发布时间】:2018-04-24 07:46:36
【问题描述】:

在阅读了很多文章之后,我仍然对 scala Shapeless 库感到有些困惑。似乎 Shapeless 使用了 scala 编译功能?那么它是否使用反射,对生产代码安全吗?

【问题讨论】:

  • 它在哪里说反射对生产代码不安全?
  • @Andrey 说得好。我不知道我从哪里得到的印象是我们应该尽量减少在生产代码中使用反射。所以这不正确?

标签: scala reflection shapeless


【解决方案1】:

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 也将比反射快得多

【讨论】:

  • 谢谢,这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2020-11-28
  • 2016-04-23
相关资源
最近更新 更多