2013-12-21 26 views
0

此刻我正嘗試用Scala編寫API。該API應該處理文件的後端,如SMB,S3,文件系統存儲等是否可以加載Scala類「動態」? (像pythons import_module)

所以我寫了一些類,如Storage這對於存儲後端一個基類,像FileSystemStorage子類,SmbStorage其子類Storage但是從現在開始,如果我在設置文件中指定它們,我想使用這些類。

我希望它像在Django:https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DEFAULT_FILE_STORAGE我可以在哪裏指定一個字符串,我的默認存儲引擎。

然後它應該「神奇地」工作,以便我可以使用DefaultStorage來訪問FileSystemStorageSmbStorage也應該可以創建更多的「存儲」類。這甚至有可能嗎?

目前我有我的想法我怎麼能意識到這一點,但我不確定這是否是在斯卡拉好的做法。

回答

1

JVM類已經動態加載。你想要的是動態選擇一個實例。

你可以這樣做:

def byName(name:String) = name match { 
    "FileSystemStorage" => FileSystemStorage 
    "SmbStorage" => SmbStorage 
} 

我假定這些對象。如果他們是班級,只需添加一個new關鍵字。

現在,如果在編譯時未知類名,則可以執行Class.forName(full_qualified_classname)。但是這會給你一個Class對象,而不是該類的實例,在這種情況下,你需要調用newInstance(假設它有一個無參數的構造函數)。你描述你的問題的方式表明你不需要這種方法。

相關問題