我认为我有一个误会,我无法弄清楚:
我希望负责反射的代码为我提供一个返回类型,我可以对其余的静态类型应用程序进行模式匹配。
我喜欢在编译期间始终使用类型,因此很安全;但是这一次我必须将反射用于传统目的;而且我正努力避免尽可能多地反映其余代码;如果我可以在运行时投射或使用asInstanceOf
之类的东西。这是我正在使用的类层次结构:
lvl1: abstract class A
/ \
lvl2: abstract class B extends A abstract class C extends A
/ \
lvl3[reflection required]: to reflect class paths
从上面可以看到,我知道反射类实例一直都是B或C,并且我不需要去lvl1
,因为我需要这些返回类型来进一步匹配模式。线。
所以首先是层次结构:
abstract class Website
abstract class Stackoverflow extends Website
abstract class Reddit extends Website
abstract class Academia extends Stackoverflow
然后我在运行时反映“学术界”:
val ru = scala.reflect.runtime.universe
val m = ru.runtimeMirror(getClass.getClassLoader)
val im = m.reflect("Academia")
现在,如果我使用getClass
,则会在invoke
中使用声明的方法,依此类推:
im.getClass.getDeclaredMethods = ??? //Set/get the methods
但是:
getClass
上进行模式匹配,则输入Class[_ <: ru.InstanceMirror]
。 java.lang.Class
我曾使用WeakType
和Recognizer
,如here所述,但是使用识别器时却得到了ru.Type
:
//Taken from cited url.
object Recognizer {
def recognize[T](x: T)(implicit tag: WeakTypeTag[T]): String =
tag.tpe match {
case TypeRef(utype, usymbol, args) => List(utype, usymbol, args).mkString("\n")
}
}
}
所以这里的问题是,有没有一种方法可以使我具有此签名:
def reflectionIWant (path: String): Either[B,C] = ???
//... or in our example case
def reflectionIant (path: String): Either[Stackoverflow, Reddit] = ???