有誰知道Scala的全功能反射API的狀態嗎?Scala的反射API
我知道你可以使用Java的反射API來做簡單的事情,但這不適用於Scala的語言特性。我發現一個interesting article描述了一個實驗性的Scala鏡像API,但據我所知這還是實驗性的。我還發現提到一個ScalaSigParser,但這似乎是相當低的水平。
這是一個好奇心,因爲我目前只是玩Scala。我認爲這個問題的答案可能對其他對Scala感興趣的人有用。
有誰知道Scala的全功能反射API的狀態嗎?Scala的反射API
我知道你可以使用Java的反射API來做簡單的事情,但這不適用於Scala的語言特性。我發現一個interesting article描述了一個實驗性的Scala鏡像API,但據我所知這還是實驗性的。我還發現提到一個ScalaSigParser,但這似乎是相當低的水平。
這是一個好奇心,因爲我目前只是玩Scala。我認爲這個問題的答案可能對其他對Scala感興趣的人有用。
的「爲JavaBean風格的圖案不可改變替換」可以表示命名參數和任選的@BeanProperty註釋:
import reflect._
case class A(@BeanProperty val x: String, @BeanProperty val y : Int)
A(x = "s", y = 3)
A(y = 3, x = "s")
添加方法(更精確的:定義一個新的接口)使得僅在感靜態如果客戶端知道新方法並且可以根據接口進行編譯,則輸入語言。通過結構化鍵入客戶可以定義他們期望在對象中出現的方法。 Scala編譯器會將結構類型轉換爲可能在運行時失敗的反射代碼。
type T = {def go(x : Int): Int }
def y(any : Any) = any.asInstanceOf[T].go(2)
class A{
def go(x : Int) = x + 1
}
y(new A())
y(new {}) //this will fail
您可以在運行中用interpreter定義新類或特徵。 Interpret方法將Scala代碼轉換爲字節代碼。
你已經提到了ScalaSigParser這是不是很容易處理。
我認爲你喜歡的功能的其餘部分還沒有。
在運行時由於轉換而失敗,而不是因爲結構類型。 – 2015-12-08 14:22:23
你能更具體地說明你想要做什麼嗎?你可以在scala.tools.nsc中使用例程來幫助修改名稱,有些事情不能很好地反映出來 - 你真的需要編譯來幫助你,因爲它們不僅僅是調用現有方法的問題例如,如果你需要一個新的封閉)。 – 2010-02-04 23:45:18
首先,我認爲用名稱參數創建類的實例會很好,這樣您就不必擔心參數的順序 - 這可能是JavaBean樣式模式的不可替代的替代。我也認爲能夠查看與Scala特性有關的類的結構會很好。即。把所有的東西都拿給我 - 找到主要的東西 - 叫它。或者回答這個字段是val還是var。另外,使用以慣用的Scala風格完成的反射API,而不是回退到Java的API會很好。只是想法.. – 2010-02-05 02:39:39
我沒有考慮一些更動態的元編程功能,比如在運行時或eval樣式語句中添加方法 - 只是更多地沿着Java反射API允許您執行但適用於Scala語言的方向。 – 2010-02-05 02:51:02