我试图使用Scala反射(即ToolBox
)在运行时生成一个类,用于与库一起使用,该库将通过Class.forName("MyClass")
反射地访问它
这可能吗?
我预计这将工作(在2.10.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
中定义的类?
任何见解都是赞赏的,朱利安
工具箱评估唯一命名包中的代码,以避免棘手的命名问题。此外,要评估的代码也被放入合成模块的合成方法中,因此所有的类都成为局部类。这就是为什么Class.forName
不能工作。
为了获得该类,如何在class C(...); classOf[C]
上执行eval ?这将返回您正在寻找的j.l.Class
。在2.11。x版本中,有一种使用Toolbox.define
的替代方法,它定义顶级类和模块并返回定义的符号,但在2.10中。我不认为没有classOf
有什么可做的。