调用 scala 类 在运行时扩展特征

Invoking scala classes which extends traits during runtime

我是 scala 的新手,所以如果我问了愚蠢的问题,请多多包涵。 我有一个要求,我需要调用一个方法 运行 次。

我有一个特征被扩展了两个 classes

trait Animal {
   def walk():DataFrame
}

这扩展了两个 classes。

class Dog(sparkSession: SparkSession) extends Animal {
   def walk():DataFrame = {
      .............
   }
}

class Cat(sparkSession: SparkSession) extends Animal {
   def walk():DataFrame = {
      .............
   }
}

现在我将从配置文件中获得这些 class 名称的列表

这么说吧

val animals = ["com.xy.Dog","com.xy.Cat"]

我需要调用这些 classes 并执行 walk 方法。 我可以做这样的事情吗?

animals.forEach{ animalString =>
   val animalObject = Class.forName(animalString ).newInstance().asInstanceOf(Animal)
   animalObject.walk
}

有几个问题,让我们一一解决:

要在 Scala 中构建列表,您需要执行以下操作:

val animals = List("com.xy.Dog", "com.xy.Cat")

forEach方法实际上是foreach,所以有一个小错别字。最后,当你调用 newInstance 时,你应该在这之前得到合适的构造函数,否则它将使用默认的构造函数。

animals.foreach { animalString =>
  val animalObject = Class.forName(animalString)
    .getConstructor(classOf[DataFrame]) // Get the constructor for a DataFrame argument
    .newInstance(dataframe)             // Pass the dataframe instance
    .asInstanceOf[Animal]
  animalObject.walk
}

我对代码做了一些小改动,以便您查看它是否正常工作。您可以 运行 应用查看输出:

class Dog extends Animal {
  def walk(): Unit = { println("I'm a dog.") }
}

class Cat extends Animal {
  def walk(): Unit = { println("I'm a cat.") }
}

object AnimalTest extends App {
  val animals = List("com.xy.Dog", "com.xy.Cat")
  animals.foreach { animalString =>
    val animalObject = Class.forName(animalString)
      .newInstance()
      .asInstanceOf[Animal]
    animalObject.walk
  }
}

请注意,我已在此处删除构造函数参数以轻松构建实例。其余的大致相同。希望对你有帮助。