【问题标题】:Iterate over the fields of an object遍历对象的字段
【发布时间】:2023-02-13 15:32:17
【问题描述】:

我有一个包含 100 个不同案例类的单例对象。例如:

object Foo {

case class Bar1 {
...
}

... 

case class Bar100 {
...
}
}

我希望能够遍历每个案例类。 类似于在 Seq 中获取所有案例类,然后能够映射到它。 (例如具有多态函数的映射)

是否可以使用反射?如果是如何?与使用所有案例类对序列进行硬编码相比,在这里使用反射的缺点是什么。

【问题讨论】:

  • > “与使用所有案例类对序列进行硬编码相比,在这里使用反射的缺点是什么。”您错过了类型安全、编译警告和相对较慢的代码。如果案例类之间有相似的功能,那么最好创建特征并对它们使用模式匹配。
  • 反射的另一个缺点:如果出于任何原因需要进行字节码混淆,则需要配置一条规则以不重命名这些类,否则基于反射的逻辑将被破坏。
  • @MikhailIonkin“你想念类型安全……”也许通过反射 OP 意味着运行时反射,但除了 Scala 中的运行时反射之外,还有编译时反射,这并不缺少类型安全。

标签: scala generics reflection polymorphic-functions


【解决方案1】:

Foo.getClass.getDeclaredClasses 为您提供在Foo 中声明的所有类。因为它们是案例类,每个还定义了一个伴生对象(也是一个类),所以您需要将它们过滤掉:

Foo.getClass.getDeclaredClasses.filterNot(_.endsWith("$"))

反射很慢,但如果你只打算做一次(没有理由做多次,因为你总是会得到相同的结果),这不是一个真正的问题。

一个更大的问题是,我真的无法想象一个“多态函数”可以让你对这些信息做任何有用的事情,而不需要一些极端的黑客攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多