Scala REPL中的访问包私有方法
假设我在Scala REPL中的访问包私有方法,scala,private,read-eval-print-loop,Scala,Private,Read Eval Print Loop,假设我在org.my.stuff中有一个private[stuff]方法stuff.something。我可以在Scala REPL中做些什么,以便调用Stuff.something,而不获取错误错误:value something不是org.my.Stuff.Stuff的成员 特别是,我是否可以让REPL“位于”给定包(此处org.my.stuff)中,从而访问其私有成员 在REPL中使用“packages” 您无法在给定包的“内部”获得REPL提示符,请参阅 您可以在REPL中的“:past
org.my.stuff
中有一个private[stuff]
方法stuff.something
。我可以在Scala REPL中做些什么,以便调用Stuff.something
,而不获取错误错误:value something不是org.my.Stuff.Stuff的成员
特别是,我是否可以让REPL“位于”给定包(此处org.my.stuff
)中,从而访问其私有成员 在REPL中使用“packages”
您无法在给定包的“内部”获得REPL提示符,请参阅
您可以在REPL中的“:paste-raw
”模式中使用“package”语句(例如,有关文档,请参见)
例如,如果您有如下代码:
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
”反射咒语,如中所述
使用与上述相同的先前代码,您可以访问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
嗯<代码>私有
事情意味着它们是私有的,你对此无能为力。但更重要的是,你不应该试图这样做。你可以在同一个包中添加一些代码,并使用REPL调用。可能重复@SarveshKumarSingh correction,我是说private[stuff]
;editing@SarveshKumarSingh,我认为这有点夸大了。在受控条件下,有一种从REPL执行的方法是很好的。在最后一段代码中,我同意你的观点。scala中的private[stuff]
方法被编译为公共方法,因为JVM没有像scala这样的细粒度访问修饰符。此外,您还可以使用:paste-raw
在REPL中定义包。谢谢,@Jasper-M,我已经相应地更新了我的答案