在Scala REPL中访问包私有方法

时间:2017-02-06 12:43:24

标签: scala private read-eval-print-loop

假设private[stuff]中有Stuff.something方法org.my.stuff。我可以在Scala REPL中执行某些操作,以便在不收到错误Stuff.something的情况下调用error: value something is not a member of org.my.stuff.Stuff吗?

特别是,我可以让REPL成为"内部"给定的包(这里是org.my.stuff),允许访问其私有成员?

1 个答案:

答案 0 :(得分:4)

在REPL中使用“packages”

您无法在给定包中“获取”REPL提示,请参阅https://stackoverflow.com/a/2632303/8261

您可以在REPL中使用“:paste -raw”模式中的“包”语句(例如,请参阅http://codepodu.com/paste-mode-in-scala-repl/了解文档)

例如,如果您的代码如下:

package org.my.stuff {
  object Stuff {
    private[stuff] val something = "x"
  }
}

您可以使用“:paste -raw”模式在同一个包中声明一个帮助类,即

scala> :paste -raw
// Entering paste mode (ctrl-D to finish)

package org.my.stuff {
  object StuffAccessHelper {
    def something = Stuff.something
  }
}

// Exiting paste mode, now interpreting.


scala> org.my.stuff.StuffAccessHelper.something
res11: String = x

如何使用setAccessible

访问任何成员

How do I read a private field in Java?

所述,您可以随时使用完整的“setAccessible”反射咒语。

使用与上述相同的先前代码,您可以访问org.my.stuff.Stuff.something,如:

scala> val f = org.my.stuff.Stuff.getClass.getDeclaredField("something")
f: java.lang.reflect.Field = private final java.lang.String org.my.stuff.Stuff$.something

scala> f.setAccessible(true)

scala> f.get(org.my.stuff.Stuff)
res10: Object = x