From 1c4765a4169c653df8501f904f047cb581578085 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Thu, 29 Sep 2011 16:41:42 +0000 Subject: Reflection classloader hack. Finding top level classes from the command line. Hackiness will diminish greatly. Review by odersky. --- src/compiler/scala/reflect/runtime/JavaToScala.scala | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/compiler/scala/reflect/runtime/JavaToScala.scala b/src/compiler/scala/reflect/runtime/JavaToScala.scala index f1eedbcf30..18db32c3bb 100644 --- a/src/compiler/scala/reflect/runtime/JavaToScala.scala +++ b/src/compiler/scala/reflect/runtime/JavaToScala.scala @@ -23,6 +23,18 @@ import internal.ClassfileConstants._ import internal.pickling.UnPickler import collection.mutable.{ HashMap, ListBuffer } import internal.Flags._ +import scala.tools.nsc.util.ScalaClassLoader +import scala.tools.nsc.util.ScalaClassLoader._ + +class MultiCL(parent: ScalaClassLoader, others: ScalaClassLoader*) extends java.lang.ClassLoader(parent) { + override def findClass(name: String): jClass[_] = { + for (cl <- others) { + try { return cl.findClass(name) } + catch { case _: ClassNotFoundException => () } + } + super.findClass(name) + } +} trait JavaToScala extends ConversionUtil { self: SymbolTable => @@ -36,7 +48,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => * Can you check with your newly acquired classloader fu whether this implementation makes sense? */ def javaClass(path: String): jClass[_] = - jClass.forName(path, false, getClass.getClassLoader) + jClass.forName(path, false, new MultiCL(getClass.getClassLoader, java.lang.ClassLoader.getSystemClassLoader)) /** Does `path` correspond to a Java class with that fully qualified name? */ def isJavaClass(path: String): Boolean = -- cgit v1.2.3