带反射的Scala对象引用
发布时间:2020-12-16 08:44:50 所属栏目:安全 来源:网络整理
导读:我是反射API的新手. 我想从其名称中获取对象的引用.我已经达到了可以使用对象的类名获取引用的程度. $scalaWelcome to Scala version 2.11.7 ...scala case object Foo { val x = 5 }defined object Fooscala import scala.reflect.runtime.{universe = ru}i
我是反射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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |