2015-02-11 14 views
2

代碼示例說明是我的目標爲:在斯卡拉在運行時多態性獲取類的實例

import scala.reflect.ClassTag 

class C[A](implicit ct: ClassTag[A]) { 
    def inst: A = ct.runtimeClass.newInstance.asInstanceOf[A] 
} 

val c = new C[String] 
c.inst 
//=> res8: String = "" 
// So far so good 

val className = "C" 
val typeParam = "String" 

如何使用classNametypeParam在運行時獲得的C[String]一個實例(使用Scala的2.11.5)?

回答

3

嗚嗚......這看起來很可疑,但無論如何,你應該能夠得到這樣的:

Class.forName(className).getConstructor(classOf[ClassTag[_]]).newInstance(
    ClassTag(Class.forName(typeParam))) 
  • 你會在classNametypeParam需要完全合格的名稱。
  • className引用的類必須具有帶ClassTag類型的一個參數的構造函數。
  • 如果有什麼不妥,它會炸燬。

您認爲您需要這樣做的目的是什麼?應該有一個更好的實現你的最終目標。

+0

負責查詢分佈式系統的類。查詢進來後,根據查詢動態確定類,然後將查詢分發給'N'個節點,確定的類編碼爲'String'。每個節點都應該實例化這個類。部分挑戰在於將其用於使用'className:String'的現有系統。謝謝你的回答,我會試試看! – devth 2015-02-12 03:03:14

+0

一個問題:由此產生的實例類型爲「Any」,所以我無法在其上調用我的「inst」方法。我嘗試了各種'asInstanceOf'咒語,但沒有運氣。 – devth 2015-02-12 16:32:05

+0

你是什麼意思,類型爲「任何」? *靜態類型*當然是'Any',但是沒有辦法繞過:如何從*動態類名*獲得* static *類型?如果你確定有這樣一個'inst'方法(通過名字),你可以再次使用反射來調用它:'x.getClass.getMethod(「inst」)。invoke(x)'(''x''是結果我的答案中的咒語)。 – sjrd 2015-02-12 16:45:28