Wenn ich in einer neuen Bibliothek recherchiere, finde ich es manchmal schwierig, die Implementierung einer Methode zu finden.
In Java liefert Metho#getDeclaringClass die Klasse, die eine bestimmte Methode deklariert hat. Durch Iteration über Class#getMethods kann ich also für jede Methode die Klasse finden, die sie erklärt hat.
In Scala werden Traits in Java-Schnittstellen umgewandelt und eine Klasse, die einen Trait erweitert, implementiert die Methoden des Traits, indem sie sie an eine Begleitklasse weiterleitet, die diese Methoden statisch definiert. Das bedeutet, dass Method#getDeclaringClass die Klasse zurückgibt, nicht den Trait:
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
Wie kann man das am besten umgehen? Das heißt, angesichts einer Klasse, wie kann ich eine Liste[(Methode, Klasse)] erhalten, wo jedes Tupel eine Methode und die Eigenschaft/Klasse ist, in der es deklariert wurde?