我有一个包含多种方法的Scala应用程序。我希望能够在某个文本文件中存储这些方法的子集列表。当我的应用程序执行时,我希望它读取该文本文件执行我在那里指定的方法。知道怎么做吗?
我知道我可以在Scala(List [Int => Int]或类似的东西)中创建包含方法名称的函数列表,然后迭代该列表。问题是我如何从文本文件动态创建该列表并让Scala识别我试图给它一个方法名称,而不仅仅是一个纯文本字符串。
感谢。
答案 0 :(得分:0)
如果将方法调用以适当的Scala语法存储在文本文件中,则可以在它们周围添加一个小类包装器(请参见下面的示例)。 (在应用程序中)调用编译器,如How to invoke the Scala compiler programmatically?所示,编译对象,然后执行ThingsToDoWhenAppStarts.methodToCallFromApp()
package com.myco.compcall
import scala.tools.nsc._
import java.io._
object MyApp {
def main(args: Array[String]): Unit = {
val fn = "/MyTextFile.txt"
val f = new File(getClass.getResource(fn).toURI)
val s = new Settings()
s.embeddedDefaults[ThingsToDoWhenAppStarts]
s.outdir.value = "target/scala-2.11/classes"
val compiler = new Global(s)
val testFiles = List(f.getAbsolutePath)
val runner = new compiler.Run()
runner.compile(testFiles)
val ftfCls = Class.forName("com.myco.compcall.FromTextFile")
val ftf = ftfCls.newInstance().asInstanceOf[ThingsToDoWhenAppStarts]
ftf.methodToCallFromApp()
}
def method1(): Unit = {
println("Method1")
}
def method2(s: String): Unit = {
println(s"Method2: $s")
}
}
abstract class ThingsToDoWhenAppStarts {
def methodToCallFromApp(): Unit
}
// ---------- ---------- ---------- //
// src/main/resources/MyTextFile.txt
package com.myco.compcall
class FromTextFile extends ThingsToDoWhenAppStarts {
def methodToCallFromApp(): Unit = {
MyApp.method1() // a call to a method defined in the app
MyApp.method2("an argument") // a call to a method defined in the app
}
}