2014-03-06 155 views
2

我有一個特徵,並從這種性狀遺傳的對象:由其名稱動態地創建一個對象(字符串)

trait MyTrait { 
    def method1(a: Int) 
} 

object MyObject extends MyTrait { 
    def method1(a: Int) = //.... 
} 

假設我有只有一個對象作爲字符串(命名空間的全名+它的名字),並知道它是從MyTrait繼承,我怎麼

  1. 在運行時
  2. 創建調用它的方法method1
  3. 將其返回給調用代碼,以便其他客戶端可以使用它?

我瞭解在Scala中反映,但奇怪的是,幾乎所有的我發現了有關在運行時創建類。

UPDATE:

我在想,爲什麼不這項工作:

scala> object MyObject { def method1(a: Int) = 123456 } 
defined module MyObject 

scala> val cs = Class.forName("MyObject") 
java.lang.ClassNotFoundException: MyObject 

由於錯誤java.lang.ClassNotFoundException: MyObject

+0

關於您的編輯:在repl會話中定義的代碼被封裝,因此[FQCN](https://en.wikipedia.org/wiki/Fully_qualified_name)[不僅僅是MyObject,而且實際上是'$ line1。$ iw。 MyObject'前綴將由REPL生成](https://stackoverflow.com/questions/7279796/scala-is-there-a-default-class-if-no-class-is-defined/7280136#7280136) –

回答

6

如果你想獲得一個單階object的實例通過反思,你可以試試這個:

package code 

object ReflectTest extends App{ 

    val clazz = Class.forName("code.MyObject$") 
    val myObj = clazz.getField("MODULE$").get(classOf[MyTrait]).asInstanceOf[MyTrait] 
    println(myObj.method1(2)) 
} 

trait MyTrait { 
    def method1(a: Int):Int 
} 

object MyObject extends MyTrait { 
    def method1(a: Int) = a + 1 
} 

現在我不是很喜歡通過反射來獲得scala object的實例(看起來很愚蠢,因爲它是一個單例),但也許你有一個有效的用例。

+0

你會用什麼來代替反射? –

+0

你的代碼運行良好。但是,如果我需要使用類型,而不是特性(以防萬一)。如果我嘗試執行'get(classOf [MyObject.type])',它不會編譯爲執行錯誤「需要類類型但找到MyObject.type」 –

+0

對象沒有類型,所以我認爲你已經不在除非你想通過實施的特質/類來引用它(如我所做的那樣)。 – cmbaxter

相關問題