java.lang.NoSuchMethodException:scala.collection.immutable.$colon$colon
我尝试使用变量作为字符串类型动态调用函数,即变量将包含函数名作为字符串。所以,我需要用这个变量调用一个函数 所以,我使用Scala反射。如果函数接受数据类型为Sting,则该函数可以工作,但抛出错误列表[Map[String,Double]] 我使用下面的链接来引用代码 下面是我正在测试的一个测试程序java.lang.NoSuchMethodException:scala.collection.immutable.$colon$colon,java,scala,intellij-idea,sbt,scala-reflect,Java,Scala,Intellij Idea,Sbt,Scala Reflect,我尝试使用变量作为字符串类型动态调用函数,即变量将包含函数名作为字符串。所以,我需要用这个变量调用一个函数 所以,我使用Scala反射。如果函数接受数据类型为Sting,则该函数可以工作,但抛出错误列表[Map[String,Double]] 我使用下面的链接来引用代码 下面是我正在测试的一个测试程序 package test import scala.collection.immutable.Map class DynamicaVariable { def cat(s1: List[M
package test
import scala.collection.immutable.Map
class DynamicaVariable {
def cat(s1: List[Map[String, Double]]) = {
println(s1)
}
}
object DynamicaVariable{
def main(args: Array[String]): Unit = {
val obj = new DynamicaVariable
val data = List(
Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0), Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
)
val functionName = "cat"
val method = obj.getClass.getMethod(functionName,data.getClass)
method.invoke(obj,data)
}
}
我的scala版本是2.11.6,我正在使用IntelliJ。我也检查了SDK版本。并取消选中scala下的“在编译过程中运行工作表”
但还是没有运气!任何想法都会有帮助。谢谢 如本文所述
在Scala类上使用Java反射可能会返回令人惊讶或不正确的结果
对于您的情况,由于数据的类型是scala.collection.immutable.List,您需要在运行时使用scala反射来获取数据val的类型。这里有一个例子
import scala.reflect.ClassTag
import scala.reflect.classTag
class DynamicaVariable {
def cat(s1: List[Map[String, Double]]) = {
println(s1)
}
}
object DynamicaVariable{
def main(args: Array[String]): Unit = {
val obj = new DynamicaVariable
val data = List(Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0)
, Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0)
, Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0)
, Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0))
val functionName = "cat"
val method = obj.getClass.getMethod(functionName, getClassOf(data).runtimeClass)
method.invoke(obj,data)
}
def getClassOf[T: ClassTag](obj: T) = classTag[T]
}
我在下面给出了一个可行的解决方案,该解决方案使用scala反射,而不是@ValentInu的java/scala混合 我不是反射大师,所以我不知道下面的内容是否是惯用的
import scala.collection.immutable.Map
import scala.reflect.runtime.{universe => ru}
class DynamicaVariable {
def cat(s1: List[Map[String, Double]]) = {
println(s1)
}
}
object DynamicaVariable {
def main(args: Array[String]): Unit = {
val obj = new DynamicaVariable
val data = List(
Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0),
Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
)
val functionName = "cat"
val mirror = ru.runtimeMirror(getClass.getClassLoader)
val instanceMirror: ru.InstanceMirror = mirror.reflect(obj)
val classSymbol = mirror.classSymbol(obj.getClass)
val termName: ru.MethodSymbol = classSymbol.info.decl(ru.TermName(functionName)).asMethod
val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(termName)
methodMirror.apply(data)
}
}
不确定是否有帮助,但通过这种方式调用getMethod
val method=obj.getClass.getMethod(functionName,classOf[List[Map[String,Double]])
对meI有效:和