Cuando investigo una nueva biblioteca, a veces me resulta difícil localizar la implementación de un método.scala reflection: getDeclaringTrait?
En Java, Metho # getDeclaringClass proporciona la clase que declaró un método determinado. Entonces al iterar sobre Class # getMethods, puedo encontrar para cada método, la clase que lo declaró.
En Scala, los rasgos se convierten en interfaces Java y una clase que amplía un rasgo implementará los métodos del rasgo reenviándolos a una clase complementaria que define estos métodos estáticamente. Esto significa, que el método # getDeclaringClass devolverá la clase, no el rasgo:
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
¿Cuál es la mejor manera de evitar esto? Es decir, dada una clase, ¿cómo puedo obtener una Lista [(Método, Clase)] donde cada tupla es un método y el rasgo/clase en el que se declaró?
supones que todas las bibliotecas están bien documentadas. y además, mi pregunta es sobre la reflexión en general, no sobre "cómo puedo investigar nuevas bibliotecas". esa parte fue para que la gente no empiece a preguntar "¿por qué necesitas tal reflexión?". – IttayD
Al determinar las cosas que pregunta (y dijo en su primera oración que estaba investigando en nuevas bibliotecas) están disponibles de manera confiable y completa en el código fuente y, por lo tanto, en el código HTML de Scaladoc. Además, dada la naturaleza de la relación entre Scala y la JVM, siempre habrá más información disponible a través de la fuente que a través del bytecode. –