问题描述
我面临的情况是我需要通过名称实例化一个类,但是该类实际上是在对象(实际上是包对象)中定义的scala类型别名。我已经弄清了很多我需要的东西,但是我找不到一种自省对象以获取类型别名的方法。
具体地说,我有字符串“ Foo.MyString”,我想根据以下定义实例化该实例。
object Foo {
type MyString = String
}
我可以使用runtimeMirror.staticModule
来获取符号,然后使用runtimeMirror.reflectModule
,但是我找不到任何方法来解析类型别名“ MyString”。
要获取Foo的方法或字段,我可以使用module.instance.getClass进行Java自省,但是Java显然无法获取类型别名。
我也尝试过使用符号,但这只是让您获得符号的所有者,而不是“拥有的”符号。
解决方法
尝试
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)