I have the following code that works in Scala 2.10 to compile external classes at runtime in Scala
@throws[IOException] def compileFiles(classDir: String): AbstractFileClassLoader = { val files = recursiveListFiles(new File(classDir)) .filter(_.getName.endsWith("scala")) println("Loaded files: \n" + files.mkString("[", ",\n", "]")) val settings: GenericRunnerSettings = new GenericRunnerSettings(err => println("Interpretor error: " + err)) settings.usejavacp.value = true val interpreter: IMain = new IMain(settings) files.foreach(f => { interpreter.compileSources(new BatchSourceFile(AbstractFile.getFile(f))) }) interpreter.getInterpreterClassLoader() }
And then in another place I could use the link to the class loader to instantiate the classes, for example.
val personClass = classLoader.findClass("com.example.dynacsv.PersonData") val ctor = personClass.getDeclaredConstructors()(0) val instance = ctor.newInstance("Mr", "John", "Doe", 25: java.lang.Integer, 165: java.lang.Integer, 1: java.lang.Integer) println("Instantiated class: " + instance.getClass.getCanonicalName) println(instance.toString)
However, the above does not work, since the getInterpreterClassLoader method getInterpreterClassLoader been removed from scala.tools.nsc.interpreter.IMain . In addition, AbstractFileClassLoader has been moved and is deprecated. It is no longer allowed to call the findClass method in the class loader from the external package.
What is the recommended way to do this in Scala 2.11? Thanks!
scala
vsnyc
source share