Scala:需要使用带有参数的Reflection创建一个类的newInstance

时间:2015-12-07 14:01:26

标签: scala reflection constructor

class Config(sourceName :String, storeClass :Class[_]) {

  def store = storeClass.getConstructor(classOf[Configuration]).newInstance(sourceName)

  def write(k :String, v :String) {
   store.writeTo(k,v)
  }

  def read(k :String): Unit ={
   store.readFrom(k)
  }

  def contains(k :String) :Boolean ={
   store.isContains(k)
  }
}

这里Configuration是父抽象类,他们有一些子类。

因此class config中的第二个参数可以是任何子class Configuration

每个子类在启动时采用参数ie; sourceName

storeClass.getConstructor(classOf[Configuration]).newInstance(sourceName)

以上代码返回类型:Any,这会产生问题,因为我需要它是Configuration类型

def store :Configuration  

属于Configuration类型,否则readwritecontains无法正常工作!

2 个答案:

答案 0 :(得分:2)

使用.asInstanceOf[Configuration]投射它。使用反射时,您必须要打破类型安全。

答案 1 :(得分:2)

getConstructor方法选择一个构造函数,该构造函数接受您提供它的类的参数。从您的代码中可能看起来您需要一个接受String的构造函数,因此您可能希望执行以下操作:

storeClass.getConstructor(classOf[String])
  .newInstance(sourceName)
  .asInstanceOf[Configuration]

但我不确定这是否是您尝试解决的问题的理想解决方案。运行时反射和Class[_]对象不是Scala-esque ......