【问题标题】:Scala : Error when using reflection to load class and methodsScala:使用反射加载类和方法时出错
【发布时间】:2018-08-16 21:25:45
【问题描述】:

我有课

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
}

【问题讨论】:

    标签: scala reflection scala-reflect


    【解决方案1】:

    对于您的示例,您缺少:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多