Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala REPL中的访问包私有方法_Scala_Private_Read Eval Print Loop - Fatal编程技术网

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,我已经相应地更新了我的答案