我想尝试使用带有typeOf[]
反射库的动态数据模型。
我在运行时使用2.11中的Scala反射ToolBox
定义了一个类:
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{ currentMirror => cm }
def cdef() = q"case class C(v: String)"
val tb = cm.mkToolBox()
val csym = tb.define(cdef())
def newc(csym: Symbol) = q"""new ${csym}("hi")"""
val obj = tb.eval(newc(csym))
我可以通过typeOf[]
输入Scala反射来绕过ClassSymbol
调用,但这需要修改我无法立即控制的库。
有没有什么方法可以将它用作入口点为typeOf[]
的库中的类型参数?
我试过了:
我发现从值到我可以在类型位置使用的东西的唯一方法是使用Java反射来调用伴侣类'apply方法并在结果上调用.type
:
val method_apply = obj.getClass.getMethod("apply", "".getClass)
val typeTemplate = method_apply.invoke(obj, "hello")
type MyType = typeTemplate.type
(保持@xeno_by和@travisbrown的menagerie of odd types的命名方案,我可以称之为“弗兰肯斯坦的类型”,因为它是由部分组成的,在错误的时间生命,不是替代品对于原始的,并且考虑到这一切都是在运行时发生的,应该用火烧掉。)
在某些情况下,此类型别名作为类型参数起作用。但是在typeOf[MyType]
的情况下,编译器在定义运行时类型之前生成TypeTag
,因此typeOf[MyType]
返回与运行时类型/类不对应的类型成员(例如TypeTag[package.Example.MyType]
而不是TypeTag[package.C]
)
我应该期望ToolBox
生成TypeTag
,如果是,我该如何使用它?
如果我必须在运行时创建TypeTag
,this question会告诉我如何,但是如何将它附加到我用作类型参数的任何内容?
感谢任何想法,
-Julian