Scala 如何访问专用功能?

Scala 如何访问专用功能?,scala,Scala,在课堂讲稿中,原始源代码如下 private val sort1 = { val method = scala.util.Sorting.getClass.getDeclaredMethod(”sort1”, classOf[Array[Int]], classOf[Int], classOf[Int]) method.setAccessible(true) (xs: Array[Int], offset: Int, len: Int) => { m

在课堂讲稿中,原始源代码如下

private val sort1 = {
   val method = scala.util.Sorting.getClass.getDeclaredMethod(”sort1”, classOf[Array[Int]], classOf[Int], classOf[Int])    
   method.setAccessible(true)
   (xs: Array[Int], offset: Int, len: Int) => {
       method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef]) 
   }
}
但是,sort1在当前的scala版本中不推荐使用

因此,我想改用insertionSort


可能吗?

您可以进行此反射,但不能。请不要。私有方法是私有的,这是有原因的。实现可能会改变,可能会被取消,或者其他任何事情。使用私有方法是一种非常糟糕的绑定形式,我们首先通过将它们私有化来避免这种绑定。也就是说,我们不应该知道在类的私有方法的保护下发生了什么。编写这样做的代码是非常脆弱和易变的

如果你真的对如何做感兴趣,请继续阅读,但最好的办法是停在这里,尝试其他方法

创建了多个版本的
insertionSort
方法(每个专用类型一个)。您可以反编译
scala.util.Sorting
以找到具有正确签名的正确方法。这里要使用的是
insertionSort$mIc$sp
。然后,您可以根据需要通过反射来访问它

val sort = {
   val method = scala.util.Sorting.getClass.getDeclaredMethod("insertionSort$mIc$sp", classOf[Array[Int]], classOf[Int], classOf[Int], classOf[Ordering[Int]])
   method.setAccessible(true)
   (xs: Array[Int], offset: Int, len: Int) => {
       method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef], implicitly[Ordering[Int]])
   }
}

但是请不要

为什么有人需要这样的黑客?对我来说,这似乎打破了API原则。你到底想做什么?我只是想知道这是否可能,以及如何做到。现在,我知道正确的签名列在排序$.class文件中。我对scala或java非常陌生,我不知道这一点。
val sort = {
   val method = scala.util.Sorting.getClass.getDeclaredMethod("insertionSort$mIc$sp", classOf[Array[Int]], classOf[Int], classOf[Int], classOf[Ordering[Int]])
   method.setAccessible(true)
   (xs: Array[Int], offset: Int, len: Int) => {
       method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef], implicitly[Ordering[Int]])
   }
}