如何使用`Class.forName()`来获取`ToolBox`中定义的类?

时间:2014-08-01 09:36:22

标签: scala reflection classloader toolbox

我正在尝试使用Scala反射(即ToolBox)在运行时生成一个类,以便与将使用Class.forName("MyClass")

反复访问它的库一起使用

这可能吗?

我预计这会起作用(在2.88.3中使用Macro Paradise进行准引用):

import scala.reflect.runtime.{currentMirror => cm}

def cdef() = q"case class MyClass(x: String)"
def newc(csym: Symbol) = q"""new ${csym.asClass}("hello")"""
val tb   = cm.mkToolBox()
val csym = tb.define(cdef())
val obj  = tb.eval(newc(csym))
val cls  = Class.forName("MyClass")

但是这会返回错误:

java.lang.ClassNotFoundException: MyClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)...

(工具箱在包装器中返回一个类,所以我也尝试使用全名,但没有运气。)

所以我怀疑我误解了如何让Toolbox使用与Class.forName()相同的类加载器

如何使用Class.forName()获取ToolBox中定义的类?

感谢任何见解, -Julian

1 个答案:

答案 0 :(得分:2)

工具箱评估唯一命名包中的代码,以避免棘手的命名问题。此外,要评估的代码也被放入合成模块的合成方法中,因此所有类都成为本地类。这就是Class.forName不起作用的原因。

为了掌握课程,如何在class C(...); classOf[C]上进行评估?这将返回您正在寻找的j.l.Class。在2.11.x中,有一个使用Toolbox.define的替代方法,它定义顶级类和模块并返回定义的符号,但是在2.10.x中我认为没有{{1}可以做很多事情。 }。