gpt4 book ai didi

带反射的Scala对象引用

转载 作者:行者123 更新时间:2023-12-04 21:11:25 27 4
gpt4 key购买 nike

我是反射 API 的新手。

我想从名称中获取对对象的引用。我已经到了可以使用对象的类名获取引用的地步。

$ scala
Welcome to Scala version 2.11.7 ...

scala> case object Foo { val x = 5 }
defined object Foo

scala> import scala.reflect.runtime.{universe => ru}
import scala.reflect.runtime.{universe=>ru}

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror...

scala> val f = m.reflectModule(m.staticModule(Foo.getClass.getName)).instance.asInstanceOf[Foo.type]
f: Foo.type = Foo

scala> f.x
res0: Int = 5

工作得很好。但是,尝试将计算类型名称用作字符串是行不通的:
scala> m.staticModule(Foo.getClass.getName)
res2: reflect.runtime.universe.ModuleSymbol = object iw$Foo$

scala> Foo.getClass.getName
res1: String = Foo$

scala> m.staticModule("Foo$")
scala.ScalaReflectionException: object Foo$ not found.
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:162)
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:22)
... 33 elided

我在这里缺少什么?谢谢。

最佳答案

这个问题只出现在 REPL 中。在 REPL 中尝试以下操作:

scala> Foo.getClass.getName.length
res5: Int = 25

所以,'Foo$' 不是类 Foo 的全名
scala> new String(Foo.getClass.getName.getBytes("UTF-8").map(b => if(b==36) '?'.toByte else b), "UTF-8")
res6: String = ?line3.?read??iw??iw?Foo?

你可以毫无问题地打电话:
scala>m.staticModule("$line3.$read$$iw$$iw$Foo$")
res7: reflect.runtime.universe.ModuleSymbol = object iw$Foo$

另见: https://issues.scala-lang.org/browse/SI-9335

关于带反射的Scala对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com