JVM反射[Scala]:基于运行时的模式匹配返回特定的类类型

时间:2019-05-14 19:33:30

标签: scala-reflect

我认为我有一个误会,我无法弄清楚:

我希望负责反射的代码为我提供一个返回类型,我可以对其余的静态类型应用程序进行模式匹配

我喜欢在编译期间始终使用类型,因此很安全;但是这一次我必须将反射用于传统目的;而且我正努力避免尽可能多地反映其余代码;如果我可以在运行时投射或使用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
  • 我曾使用WeakTypeRecognizer,如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] = ???

0 个答案:

没有答案