在 Scala REPL 中访问包私有方法
Access package private method in Scala REPL
假设我在 org.my.stuff
中有一个 private[stuff]
方法 Stuff.something
。我可以在 Scala REPL 中做些什么,这样我就可以调用 Stuff.something
而不会收到错误 error: value something is not a member of org.my.stuff.Stuff
吗?
特别是,我能否让 REPL 成为 "inside" 给定的包(这里是 org.my.stuff
),从而允许访问其私有成员?
在 REPL
中使用 "packages"
您无法获得 REPL 提示 "inside" 给定的包,请参阅
您可以在 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
”模式在同一个包中声明一个助手 class,即
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
假设我在 org.my.stuff
中有一个 private[stuff]
方法 Stuff.something
。我可以在 Scala REPL 中做些什么,这样我就可以调用 Stuff.something
而不会收到错误 error: value something is not a member of org.my.stuff.Stuff
吗?
特别是,我能否让 REPL 成为 "inside" 给定的包(这里是 org.my.stuff
),从而允许访问其私有成员?
在 REPL
中使用 "packages"您无法获得 REPL 提示 "inside" 给定的包,请参阅
您可以在 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
”模式在同一个包中声明一个助手 class,即
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