2015-02-11 17 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