Scala v 2.10:如何从类名开始获取类(对象)的新实例

时间:2013-08-18 10:20:48

标签: scala classloader scala-2.10

我需要解析数十个JSON片段,对于每个片段,我需要获得正确解析器的实例。我的想法是创建一个配置文件,在其中写入要为每个解析器实例化的类的名称(一种地图URL - >解析器)。回到你的解决方案,如果我有一个指向Any的指针,我无法调用我在每个解析器中实现的方法。我认为这是一个非常普遍的问题,有一套完善的解决方案,但我不知道最佳做法是什么。

我真的没有Java,反射,类加载等所有东西的经验。所以, 任何人都可以为我写下以下方法的主体吗?我需要获取一个以String形式传递的类的实例(构造函数不需要参数,至少到目前为止......)

def createInstance(clazzName: String) = {
  // get the Class for the given clazzName, e.g. "net.my.BeautifulClazz"

  // instantiate an object and return it
}

谢谢,像往常一样......

1 个答案:

答案 0 :(得分:1)

有一个非常简单的答案:

scala> def createInstance(clazzName: String) = Class.forName(clazzName).newInstance
createInstance: (clazzName: String)Any

scala> createInstance("java.lang.String")
res0: Any = ""

如果它适合你,一切都很好。如果没有,我们必须查看你的类加载器。这通常是事情变得肮脏的时候。

根据您的目的,请查看:

  1. cake pattern,如果您想在编译期间合并您的类
  2. OSGi,当你想要构建一个插件基础结构时(看一下here的一个非常简单的例子)
  3. Google guice,如果你真的需要依赖注入(例如混合使用Scala和Java代码)并且蛋糕模式不适合你