У меня возникли проблемы с поиском apply
метода в случае класса объекта-компаньона, когда этот класс случая определяются как внутренний класс, в следующем сценарии:Отражение: Получение модуля зеркала из внутреннего класса примешивается одноплодным объект
case class Outer()
trait Foo {
case class Inner()
}
object Bar extends Foo
подход до сих пор:
import reflect.runtime.{currentMirror => cm, universe => ru}
def getApplyMethod[A: ru.TypeTag]: ru.MethodSymbol = {
val sym = ru.typeOf[A].typeSymbol
val clazz = sym.asClass
val mod = clazz.companionSymbol.asModule
if (!mod.isStatic) println(s"Oh oh... $mod") // and now?
val im = cm.reflect(cm.reflectModule(mod).instance)
val ts = im.symbol.typeSignature
val mApply = ts.member(ru.newTermName("apply")).asMethod
mApply
}
getApplyMethod[Outer]
getApplyMethod[Bar.Inner] // oh oh, detected, but what do to?
предложение от компилятора:
object Inner is an inner module,
use reflectModule on an InstanceMirror to obtain its ModuleMirror
Итак, как бы я это сделал, учитывая, что единственная информация getApplyMethod
есть TypeTag[Bar.Inner]
?
Примечание, что эта проблема вводится путем смешивания в Inner
от признака. Если бы я был
object Bar { case class Inner() }
это работает отлично, Inner
модуль «статический».
возможно дубликат [Получить экземпляр объекта компаньоном внутреннего Modul с отражением API Scala] (http://stackoverflow.com/questions/16440124/get-the -companion-object-instance-of-a-inner-modul-with-the-scala-reflection-api) – senia
@senia Я видел этот вопрос. Но (а) у вас есть фактическое значение, чтобы взять зеркало экземпляра, (b) оно не охватывает общий случай, когда могут возникать как статические, так и нестатические. –