调用 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
}
}
请注意,我已在此处删除构造函数参数以轻松构建实例。其余的大致相同。希望对你有帮助。
我是 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
}
}
请注意,我已在此处删除构造函数参数以轻松构建实例。其余的大致相同。希望对你有帮助。