加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

带反射的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读