问题描述
我对多个对象之一拥有一个TypeTag
,并且我知道它们使用已知的方法签名扩展了基本特征。如果需要,我也可以访问该方法的MethodSymbol
。我想做的是:
def invokeMyMethod[T: TypeTag](myMethodSymbol: MethodSymbol): String = {
// I know T has structural type { def myMethod: String }
// so I want the result of calling T.myMethod but I don't have
// access to the actual object T,only its type.
}
因为我知道类型表示一个对象,所以我知道该方法是静态的,因此我只需要访问单例实例即可调用该方法。不幸的是,我找不到从类型到实例的方法。
我知道我可以从RuntimeClass
获取一个runtimeMirror
实例,但是我不确定一旦拥有该类该怎么办。它似乎本质上具有类型AnyRef
,因此我尝试在没有运气的情况下进行投射:
def invokeMyMethod[T: TypeTag]: Any = {
val runtimeT = runtimeMirror(getClass.getClassLoader).runtimeClass(T)
runtimeT.asInstanceOf[{ def myMethod: String }].myMethod
// Error invoking method 'myMethod'
}
我也知道我可以从我的ClassMirror
中获得一个ClassSymbol
,但这似乎只能访问构造函数MethodMirror
,如果我的物品是一个对象而不是我的物品,那将无济于事一个班级:
def invokeMyMethod[T: TypeTag](myMethodSymbol: MethodSymbol): Any = {
val mirror = runtimeMirror(getClass.getClassLoader)
val runtimeT = mirror.runtimeClass(T)
val mirrorT = mirror.reflect(runtimeT)
mirrorT.reflectMethod(myMethodSymbol)()
// Expected a member of class Class,you provided value T.myMethod
}
我知道如果我有T
的实际运行时实例,那么使用InstanceMirror
会很容易,但是我不知道如何获取对象类型的InstanceMirror
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)