Scala:使用反射加载类和方法时出错

时间:2018-08-15 22:22:40

标签: scala reflection scala-reflect

我上课

class LrGen extends IModelGen {

  var header = Array(
    "First name",
    "last name",
    "address",
    "city",
    "state",
    "zip"
  )

  override def getHeader(separator:String): String =
  {
    header.mkString(separator)
  }

}

我试图通过以下反射来调用该类的getHeader方法:How to invoke method on companion object via reflection?,但由于我的类名也会有所不同,因此进行了一些修改。我的代码如下:

val clazzToInvoke = classInitialName+ "Gen"+"$"
import scala.reflect.runtime.universe._

// get runtime universe
val ru = scala.reflect.runtime.universe

// get runtime mirror
val rm = ru.runtimeMirror(this.getClass.getClassLoader)

// get instance mirror for companion object for the class
val moduleSymbol  = rm.reflect(Class.forName(clazzToInvoke))


val methodGetHeader = ru.typeOf[clazzToInvoke.type].decl(ru.TermName("getHeader")).asMethod

println(methodGetHeader("\t"))

但是,我遇到了错误:

error: ru.MethodSymbol does not take parameters
[ERROR]     println(methodGetHeader("\t")

有见识吗?预先感谢。

供参考我的界面如下:

trait  IModelGen
{
  def getHeader(separator:String): String
}

1 个答案:

答案 0 :(得分:0)

对于您的示例,您不见了:

val methodHi = instanceMirror.reflectMethod(methodGetHeader)
methodGetHeader()

和供您参考的链接:它用于调用 object / singleton 方法,但对于LrGen而言,它不是一个 singleton对象的类。

>

所以也许您需要实例化一个类并调用 getHeader方法,例如:

val lr = classOf[LrGen].getConstructors()(0).newInstance().asInstanceOf[LrGen]
lr.getHeaders("\t")