调用仅访问包含对象类型的静态方法

问题描述

我对多个对象之一拥有一个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 (将#修改为@)