【问题标题】:Call scala method from object dynamically从对象动态调用scala方法
【发布时间】:2019-09-11 15:25:43
【问题描述】:

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

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,但我不想每次都创建多个实例。是否有可能在单行中做到这一点。

【问题讨论】:

  • 你能描述一下你的用例吗?在 Scala 中,反射很少是解决问题的最佳方法。

标签: scala reflection scala-reflect


【解决方案1】:

用美元符号试试

val object_name = "com.User$"

如果对象User 在包com 中。

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

您还应该指定参数的类别

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

【讨论】:

  • 我尝试运行 Class.forName(object_name + "$").getDeclaredMethod(method_name).invoke(rdd) 但仍然相同。找不到这样的方法。你能分享代码sn-p吗?这将有助于理解。
  • @NachiketKate 您还应该指定参数类型Class.forName("com.User$").getDeclaredMethod("getRdd", classOf[RDD[JsValue]], classOf[String])
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2012-04-08
  • 2010-11-30
  • 2011-12-10
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多