2017-01-03 3 views
-1

В лекции отметить, оригинальный исходный код нижеКак получить доступ к частной специализированной функции?

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.

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

Мне просто интересно, можно ли и как. Теперь я знал, что правильная подпись указана в файле Sorting $ .class. Я очень новичок в scala или java, я этого не знал. – newpolaris

ответ

2

Вы можете сделать это отражение, но не делать этого. Пожалуйста, нет. Частные методы являются частными по причине. Реализация может измениться, может быть отменена или что-то еще. Использование частных методов - очень плохая форма привязки, которую мы избегаем, делая их частными в первую очередь. То есть мы не должны знать, что происходит под капотом частных методов класса. Написание кода, который делает это, является чрезвычайно хрупким и неустойчивым.

Если вы действительно заинтересованы в том, как, читать дальше, но лучше всего было бы остановиться прямо здесь и попробовать что-то еще.

Созданы несколько версий метода 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]]) 
    } 
} 

Но пожалуйста, не надо!

Смежные вопросы