我正在尝试使用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
答案 0 :(得分:2)
工具箱评估唯一命名包中的代码,以避免棘手的命名问题。此外,要评估的代码也被放入合成模块的合成方法中,因此所有类都成为本地类。这就是Class.forName
不起作用的原因。
为了掌握课程,如何在class C(...); classOf[C]
上进行评估?这将返回您正在寻找的j.l.Class
。在2.11.x中,有一个使用Toolbox.define
的替代方法,它定义顶级类和模块并返回定义的符号,但是在2.10.x中我认为没有{{1}可以做很多事情。 }。