If your goal is to run external scala classes in runtime, I’d suggest using eval with scala.tools.reflect.ToolBox
(it is included in REPL, but for normal usage you have to add scala-reflect.jar):
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
tb.eval(tb.parse("""println("hello!")"""))
You also can compile files, using tb.compile
.
Modified with example: assume you have external file with
class PersonData() {
val field = 42
}
scala.reflect.classTag[PersonData].runtimeClass
So you do
val clazz = tb.compile(tb.parse(src))().asInstanceOf[Class[_]]
val ctor = clazz.getDeclaredConstructors()(0)
val instance = ctor.newInstance()
Additional possibilities are (almost) unlimited, you can get full tree AST and work with it as you want:
showRaw(tb.parse(src)) // this is AST of external file sources
// this is quasiquote
val q"""
class $name {
..$stats
}
scala.reflect.classTag[PersonData].runtimeClass
""" = tb.parse(src)
// name: reflect.runtime.universe.TypeName = PersonData
// stats: List[reflect.runtime.universe.Tree] = List(val field = 42)
println(name) // PersonData
See official documentation for these tricks:
http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html