mit*_*hus 2 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),从而可以访问其私有成员?
您无法在给定包的“内部”获得 REPL 提示,请参阅/sf/answers/184261241/
您可以:paste -raw在 REPL 中的“ ”模式中使用“package”语句(参见例如http://codepodu.com/paste-mode-in-scala-repl/文档)
例如,如果您有如下代码:
package org.my.stuff {
object Stuff {
private[stuff] val something = "x"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用“ :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
Run Code Online (Sandbox Code Playgroud)
setAccessible您总是可以使用完整的“ setAccessible”反射咒语,如如何在 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1859 次 |
| 最近记录: |