0

I have a class

class LrGen extends IModelGen {

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

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

}

I am trying to invoke the getHeader method of that class using reflection following: How to invoke method on companion object via reflection? but modified slightly as my class name will vary as well. My code looks like:

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"))

However, I am getting error:

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

Any insight? Thanks in advance.

For reference My interface looks like :

trait  IModelGen
{
  def getHeader(separator:String): String
}
James Whiteley
  • 3,363
  • 1
  • 19
  • 46
VictorGram
  • 2,521
  • 7
  • 48
  • 82

1 Answers1

0

For your example, you are missing:

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

and for your reference link: it's used for invoking the object/singleton method, but for LrGen is a class not a singleton object.

so maybe you need to instantiate a class and invoke getHeader method, like:

val lr = classOf[LrGen].getConstructors()(0).newInstance().asInstanceOf[LrGen]
lr.getHeaders("\t")
chengpohi
  • 14,064
  • 1
  • 24
  • 42