2015-06-08 119 views
0

在Scala中,動態調用對象並使用反射調用方法的最佳方式是什麼?與該對象相對應的方法將被調用,但對象名稱是動態已知的。從Scala對象動態訪問方法

我能夠從this SO question動態實例化一個scala類,但是我需要爲一個對象做同樣的事情。

下面是一些清晰度示例代碼:

class CC { 
    def CC() = { 
    } 
} 
object CC { 
    def getC(name : String) : CC = { 
     return new CC(); 
     } 
    } 
} 
class CD { 
    def CD() = { 
    } 
} 
object CD { 
    def getC(name : String) : CC = { 
     return new CD(); 
     } 
    } 
} 

現在我有個基類,需要調用getC方法,但相應的對象是動態知道。那麼如何實現相同?

此外,基類和我的疑問是在類的評論。

class Base { 
    def Base() = { 
    } 
    def createClass(name : String) = { 
    // need to call the method corresponding to the object depending 
    // on the string. 
    //e.g.: if name = "C" call CC.getC("abcd") 
    //  if name = "D" call CD.getC("abcd") 
    } 
} 

回答

3

你仍然可以使用Scala的運行時反射:

import scala.reflect.runtime.{universe => ru} 

val m = ru.runtimeMirror(getClass.getClassLoader) 
val ccr = m.staticModule("my.package.name.ObjName") // e.g. "CC" or "CD" 
type GetC = { 
def getC(name:String): CC 
} 
val cco = m.reflectModule(ccr).instance.asInstanceOf[GetC] 

現在你可以使用它作爲cco.getC ...