gpt4 book ai didi

scala - 在 Scala REPL 中访问包私有(private)方法

转载 作者:行者123 更新时间:2023-12-02 04:00:41 24 4
gpt4 key购买 nike

假设我在 org.my.stuff 中有一个 private[stuff] 方法 Stuff.something。我可以在 Scala REPL 中做些什么,这样我就可以调用 Stuff.something 而不会出现错误 error: value something is not member of org.my.stuff.Stuff

特别是,我能否让 REPL 位于给定包的“内部”(此处为 org.my.stuff),从而为其私有(private)成员提供访问权限?

最佳答案

在 REPL 中使用“包”

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

您可以在 REPL 中的“:paste -raw”模式下使用“package”语句(参见例如 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访问任何成员

您始终可以求助于完整的“setAccessible”反射咒语,如How do I read a private field in Java? 中所述。

使用与上面相同的先前代码,您可以像这样访问 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

关于scala - 在 Scala REPL 中访问包私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42068129/

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