From 5bae313f42a697ff2c4a55b861254764df071971 Mon Sep 17 00:00:00 2001 From: Lex Spoon Date: Thu, 15 Jun 2006 15:15:47 +0000 Subject: --- src/compiler/scala/tools/nsc/ObjectRunner.scala | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/compiler/scala/tools/nsc/ObjectRunner.scala (limited to 'src/compiler/scala/tools/nsc/ObjectRunner.scala') diff --git a/src/compiler/scala/tools/nsc/ObjectRunner.scala b/src/compiler/scala/tools/nsc/ObjectRunner.scala new file mode 100644 index 0000000000..5649fcbc05 --- /dev/null +++ b/src/compiler/scala/tools/nsc/ObjectRunner.scala @@ -0,0 +1,36 @@ +package scala.tools.nsc +import java.net.URLClassLoader +import java.io.File +import java.lang.reflect.{Method,Modifier} + +/** An object that runs another object specified by name. */ +object ObjectRunner { + def isMainMethod(meth: Method): Boolean = { + def paramsOK(params: Array[Class]): Boolean = { + (params.length == 1) && + (params(0) == classOf[Array[String]]) + } + meth.getName == "main" && + Modifier.isStatic(meth.getModifiers) && + paramsOK(meth.getParameterTypes) + } + + def run( + classpath: List[String], + objectName: String, + arguments: Seq[String]): Unit = + { + val classpathURLs = classpath.map(s => new File(s).toURL).toArray + val mainLoader = new URLClassLoader(classpathURLs, null) + val clsToRun = Class.forName(objectName, true, mainLoader) + + val method = clsToRun.getMethods.find(isMainMethod) match { + case Some(meth) => meth + case None => { + throw new Error("no main method in object " + objectName) + } + } + val res = method.invoke(null, List(arguments.toArray).toArray) + () + } +} -- cgit v1.2.3