在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")
// }
//}