2017-01-03 10 views
-1

は、元のソースコードは、SORT1は、現在の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) => { 
     method.invoke(scala.util.Sorting, xs, offset.asInstanceOf[AnyRef], len.asInstanceOf[AnyRef]) 
    } 
} 

を下回っている。しかし。

代わりに、代わりにinsertionSortを使用したいと思います。

src/library/scala/util/Sorting.scala

private def insertionSort[@specialized T](a: Array[T], i0: Int, iN: Int, ord: Ordering[T]): Unit = { 
    ... 
} 

それは可能ですか?

+0

誰もこのようなハッキングを必要とするのはなぜですか?それは私にAPIの原則を破るようだ – cchantep

+0

あなたは何を正確にしようとしていますか? – Dima

+0

私はそれが可能であり、どのようにするのだろうと思っています。さて、$ .classファイルのソートに正しい署名が記載されていることが分かりました。私はスカラやjavaにはとても新しいので、私はそれを知らなかった。 – newpolaris

答えて

2

このリフレクションを行うことはできますが、そうすることはできません。 くださいしないでください。プライベートメソッドは、プライベートな理由からです。実装が変更されたり、削除されたりする可能性があります。プライベートメソッドを使用することは、最初の場所でプライベートメソッドを使用しないようにすることを回避する、非常に悪いバインディングのフォームです。つまり、私たちは、クラスのプライベートメソッドのフードの下で何が起こっているのかを知ることは想定されていません。これを行うコードを書くことは非常に脆弱で揮発性です。

本当に興味がある方は、こちらを読んでください。しかし、ここでやり直してみてください。

insertionSortメソッドの複数のバージョンが作成されます(特殊タイプごとに1つ)。 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]]) 
    } 
} 

しかしくださいは、しないでください!