當我研究一個新的庫時,我有時會發現很難找到方法的實現。scala反射:getDeclaringTrait?
在Java中,Metho#getDeclaringClass提供了聲明給定方法的類。因此,通過迭代Class#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 2009-12-02 17:51:00
確定你詢問的事情(你在第一句話中曾經說過你正在研究新的庫)可靠並且完全地在源代碼中提供,因此在Scaladoc HTML中也是可用的。此外,鑑於Scala和JVM之間關係的性質,通過源可以獲得更多的信息,而不是通過字節碼。 – 2009-12-02 18:41:19