从对象动态调用scala方法

时间:2019-09-11 15:25:43

标签: scala reflection scala-reflect

我有一个如下所示的scala case类和对象,

case class User(userId: Long, UserName: String, ts: Timestamp)

object User {

  def getRdd(rdd: RDD[JsValue], type : String): RDD[User] = {

    val rdd1: RDD[User] = rdd.map(doc => processEvent(doc))
      .filter(event => event._1.equals(rddType)).map(event => {
      User.get_class_obj(event)
    })
    rdd1
  } 

}

我想从另一个对象调用用户对象的“ getRdd”方法,而不创建对象/类的实例。像下面一样,

val object_name = "com.User"
val method_name = "getRdd"

我尝试过

val no = Array(1, 2, 3, 4, 5,6,7,8,9,10)
val rdd = sc.parallelize(no)


Class.forName(object_name).getDeclaredMethod(method_name).invoke(rdd)

但是失败,没有nosuchmethod错误。我已经回答了here,但是我不想每次都创建多个实例。一口气可以做到吗?

1 个答案:

答案 0 :(得分:0)

尝试使用美元符号

val object_name = "com.User$"

如果对象User在软件包com中。

从Java的角度来看,User是一个类,User$是它的伴随对象。

您还应该指定参数类

Class.forName("com.User$").getDeclaredMethod("getRdd", classOf[RDD[_]], classOf[String])
相关问题