Когда я исследую новую библиотеку, мне иногда трудно найти реализацию метода.scala reflection: getDeclaringTrait?
В Java, Metho # getDeclaringClass предоставляет класс, объявивший данный метод. Поэтому, повторяя класс getMethods класса #, я могу найти для каждого метода класс, который его объявил.
В Scala черты преобразуются в интерфейсы Java, а класс, который расширяет черту, реализует методы этого признака путем перенаправления их в класс-компаньон, определяющий эти методы статически. Это означает, что метод # getDeclaringClass будет возвращать класс, а не черта:
scala> trait A { def foo = {println("hi")}}
defined trait A
scala> class B extends A
defined class B
scala> classOf[B].getMethods.find(_.getName() == "foo").get.getDeclaringClass
res3: java.lang.Class[_] = class B
Каков наилучший способ обойти это? Смысл, учитывая класс, как я могу получить List [(Method, Class)], где каждый кортеж является методом и признаком/классом, в котором он был объявлен?
Вы считаете, что каждая библиотека хорошо документирована. и, кроме того, мой вопрос касается размышлений в целом, а не «как я могу исследовать новые библиотеки». эта часть была так, чтобы люди не стали спрашивать «зачем вам такое отражение?». – IttayD
Устанавливая то, о чем вы спрашиваете (и вы сказали в своем первом предложении, что вы проводите исследования в новых библиотеках), надежно и полностью доступны в исходном коде и, следовательно, в HTML-коде Scaladoc. Кроме того, учитывая характер отношений между Scala и JVM, дополнительная информация всегда будет доступна через источник, а не через байт-код. –