【问题标题】:Can Scala reflection get you the list of type aliases defined in a class?Scala 反射能否为您提供类中定义的类型别名列表?
【发布时间】:2021-02-21 12:15:21
【问题描述】:

我面临的情况是我需要按名称实例化一个类,但该类实际上是在对象中定义的 scala 类型别名(实际上是一个包对象)。我已经弄清楚了我需要的很多东西,但是我找不到一种方法来内省对象以获取类型别名。

具体来说,我有字符串“Foo.MyString”,我想根据以下定义实例化它的一个实例。

object Foo {
   type MyString = String
}

我可以使用runtimeMirror.staticModule 获取符号,然后使用runtimeMirror.reflectModule,但是我找不到任何方法来解析“MyString”的类型别名。

要获取 Foo 的方法或字段,我可以使用 module.instance.getClass 下拉到 Java 自省,但 Java 显然没有获取类型别名的方法。

我也尝试过使用符号,但这只是让您获得符号的所有者,而不是“拥有”符号。

【问题讨论】:

  • @texasbruce 对不起,关于 Scala 反射,我猜你错了。看我的回答。
  • @texasbruce Scala 反射不仅可以看到 Java 世界中基于类的事物,还可以看到保留在 Scala 签名中的信息(ScalaSig,一种字节码中的 cmets)。

标签: scala reflection scala-reflect


【解决方案1】:

试试

typeOf[Foo.type].decl(TypeName("MyString")).asType.toType.dealias // String
typeOf[Foo.type].decl(TypeName("MyString")).typeSignature.dealias // String

val moduleSymbol = runtimeMirror.staticModule("pckg.App.Foo")
moduleSymbol.typeSignature.decl(TypeName("MyString")).asType.toType.dealias // String
moduleSymbol.typeSignature.decl(TypeName("MyString")).typeSignature.dealias // String

有关所有类型成员的列表,请参阅 .decls 而不是单个 .decl(...)。您可以过滤列表

typeOf[Foo.type].decls.filter(_.isType)

【讨论】:

  • 谢谢。这是我错过的typeSignature 电话!作为任何试图在 Scala 包对象上执行此操作的人的一些额外信息,答案是 val moduleSymbol = runtimeMirror.staticModule("ai.closedloop.foo.package")
猜你喜欢
  • 2019-02-11
  • 2014-10-18
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2021-09-08
  • 2015-04-18
  • 2015-08-21
  • 2021-06-15
相关资源
最近更新 更多