Я продолжаю посещать эту страницу, когда забываю, как это сделать, и ответы не являются на сто процентов удовлетворительными для меня. Вот как я делаю с отражением:
val thisClassCompanion = m.reflect(this).symbol.companion.asModule
val structural = m.reflectModule(thisClassCompanion)
.instance.asInstanceOf[{def doSth: Unit}]
Возможно, вам потребуется проверить, что класс действительно имеет объект-компаньон, или companion.asModule сгенерирует исключение отражения, а не модуль
Обновлено: добавлен еще один пример для наглядности:
object CompanionUtil {
import scala.reflect.runtime.{currentMirror => cm}
def companionOf[T, CT](implicit tag: TypeTag[T]): CT = {
Try[CT] {
val companionModule = tag.tpe.typeSymbol.companion.asModule
cm.reflectModule(companionModule).instance.asInstanceOf[CT]
}
}.getOrElse(throw new RuntimeException(s"Could not get companion object for type ${tag.tpe}"))
}