Scala:存储要在文本文件中执行的方法列表

时间:2017-03-23 12:56:14

标签: scala

我有一个包含多种方法的Scala应用程序。我希望能够在某个文本文件中存储这些方法的子集列表。当我的应用程序执行时,我希望它读取该文本文件执行我在那里指定的方法。知道怎么做吗?

我知道我可以在Scala(List [Int => Int]或类似的东西)中创建包含方法名称的函数列表,然后迭代该列表。问题是我如何从文本文件动态创建该列表并让Scala识别我试图给它一个方法名称,而不仅仅是一个纯文本字符串。

感谢。

1 个答案:

答案 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
    }
}