2013-12-13 69 views
1

我有一個用例,我需要根據用戶輸入創建一個類。如何基於用戶輸入創建一個scala類?

例如,用戶輸入可以是: 「(中等,fieldname1):(字符串,fieldname2):..等」 然後一個類必須被創建爲在運行時

Class Some 
{ 
    Int fieldname1 
    String fieldname2 
    ..so..on.. 
} 

是如下這是Scala支持的東西嗎?任何幫助真的很感激。

回答

0

不,不是真的。

類的想法是定義一個可以在編譯時檢查的類型。你看,在運行時創建它會有點矛盾。

您可能希望以不同的方式存儲用戶輸入,例如,一張地圖。

你想通過在運行時創建一個類來實現什麼?

+1

嗯......一方面,scala的類型系統特別針對編譯時間(並且在運行時拋出大量類型信息),另一方面,我敢肯定你可以生成java字節碼並將其饋送到類加載器以在運行時定義一個新類。然而,使用它將會同樣乏味並涉及反思。 –

+0

我正試圖用Slick導出數據庫結果。 Slick需要一個模式來獲取輸入的信息。在我的情況下,返回的結果是動態的。所以,我必須以某種方式在運行時創建一個類 – Rahul

+0

您可以使用Slick的Plain SQL查詢來獲得通用結果(PositionedResult)並將它們映射到您自己的喜好。見http://stackoverflow.com/questions/19894465/scala-slick-plain-sql-retrieve-multiple-results-into-list-of-maps – lutzh

4

您的情況似乎沒有道理。這不是運行時實例化的問題(JVM肯定可以通過反射來實現)。真的,你要問的是動態生成一個類,只有當你的代碼稍後使用它時纔有用。但是如果你不知道它是什麼樣的,那麼你的代碼在以後如何使用它呢?例如,您的後續代碼將如何知道它可以引用哪些字段?

+0

你的觀點是對的。我不能在以後使用它。你在暗示什麼? – Rahul

0

我認爲這是有道理的,只要你以通用的方式使用你的「數據模型」。

這種方法在這裏工作嗎?依靠。

如果你的數據從一個文件在運行時讀,但在編譯的時候快到了,那麼你運氣類型安全是將保持不變。事實上,你會有兩個選擇。

  1. 拆分項目分爲兩個:

    • 在第一次運行,讀取文件,並寫入新源 程序(如字符串,或更好,具有Treehugger)。

    • 在第二次運行中,編譯您的生成的類與您的項目的其餘部分,並正常使用它。

  2. 如果第1條是太 「手動」,然後使用Macro Annotations。這裏的想法是主子項目的編譯時間跟在宏子項目的運行時間之後。因此,如果我們爲主子項目提供一個「空」類,可以使用宏在運行時看到的數據在編譯時動態地將其添加到其中。 - 要開始,修改宏從文件中this example

否則讀,如果你的數據是真正在運行時纔可知,然後@Rob椋鳥的建議可能會爲你工作,因爲它沒有我。如果你想成爲一隻豚鼠,我會分享my attempt。爲了調試,我有一個應用程序。在那裏展示瞭如何將字符串傳遞給運行時類生成器,並在運行時使用Java反射來訪問它,甚至可以用它定義一個Scala類別別名。所以問題是,您的新動態類會在Slick中作爲類型參數嗎,還是會失敗,因爲它有時會與其他庫一起使用?

+0

謝謝Julian,我認爲case-class-generator就是我所需要的。我會試試這個,讓你知道。案例類是Slick用來查詢數據的。所以,如果你的軟件包提供了運行時類型的Case Classes,我的問題就解決了。 – Rahul

+0

在運行時獲取類是很容易的部分,確保它被視爲適當的類型是棘手的部分。所以通過反射使用這個類將會起作用,但是不會將Slick用作類型參數?一些庫*可以使用生成的類作爲類型參數,其他類可以以某種方式阻塞它。 –

相關問題