Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中使用反射类概念时面临的问题_Scala_Reflection_Scala Reflect - Fatal编程技术网

在scala中使用反射类概念时面临的问题

在scala中使用反射类概念时面临的问题,scala,reflection,scala-reflect,Scala,Reflection,Scala Reflect,我有一个这样的主要课程: class Test { def exe(first:String, second:String, task:String):String = { task match { case "A" => { val obj = new A(first) obj.defineSecond(second) } case "B" =>

我有一个这样的主要课程:

class Test {
  def exe(first:String, second:String, task:String):String = {
     task match {
       case "A" => {
          val obj = new A(first)
          obj.defineSecond(second)
       }
       case "B" => {
          val obj = new B(first)
          obj.defineSecond(second)
       }
       case "C" => {
          val obj = new C(first)
          obj.defineSecond(second)
       }
       ....so many cases
   }
 }
}
我尝试在scala中使用反射的概念,而不是每次添加新类时都在测试类中编写用例。 以下是我所尝试的:

val m = ru.runtimeMirror(getClass.getClassLoader)
val classTest = ru.typeOf[Test].typeSymbol.asClass
val cm = m.reflectClass(classTest)
但由于类测试是内部类,所以获取错误时,请在InstanceError上使用reflectClass来获取其类镜像“


有谁知道我如何避免每次创建新类时都将案例添加到我的主类中,而我可以以一种适用于每个案例的方式编写我的主类。

我猜您在问题中没有提供所有必要的信息。错误消息中写着“class
Test
是内部类”,但
Test
在代码段中不是内部类。如果您希望修复运行时反射代码,请提供反映实际用例的代码段

同时,您可以尝试(在编译时工作)

用法:

class A(s: String) {
  def defineSecond(s1: String): String = ""
}
class B(s: String) {
  def defineSecond(s1: String): String = ""
}
class C(s: String) {
  def defineSecond(s1: String): String = ""
}

new Test().exe("first", "second", "task")

//scalac: "task" match {
//  case "A" => {
//    val obj = new A("first");
//    obj.defineSecond("second")
//  }
//  case "B" => {
//    val obj = new B("first");
//    obj.defineSecond("second")
//  }
//  case "C" => {
//    val obj = new C("first");
//    obj.defineSecond("second")
//  }
//}

老实说,我会继续比赛。或者您可以使用来定义所有任务,这样您就可以轻松地构建从名称到任务的映射。运行时反射很少是合适的解决方案谢谢!!我的实际类定义与Test相同。案例“A”和“B”只不过是规则类。要调用的规则类的名称在“Task:String”中,它首先包含我必须应用规则的实际数据。每次我实现新类时,我也必须将其添加到测试类中,因此需要将其动态化,以便删除重复的代码,因为除类名外,所有情况几乎相同。@SunnyArora再一次,在您的代码段
中,Test
不是内部的。它实际上是内在的吗?然后请提供它的内部代码段。
class A(s: String) {
  def defineSecond(s1: String): String = ""
}
class B(s: String) {
  def defineSecond(s1: String): String = ""
}
class C(s: String) {
  def defineSecond(s1: String): String = ""
}

new Test().exe("first", "second", "task")

//scalac: "task" match {
//  case "A" => {
//    val obj = new A("first");
//    obj.defineSecond("second")
//  }
//  case "B" => {
//    val obj = new B("first");
//    obj.defineSecond("second")
//  }
//  case "C" => {
//    val obj = new C("first");
//    obj.defineSecond("second")
//  }
//}