是否可以加载scala类“动态”? (像pythons import_module)

时间:2013-12-21 21:06:38

标签: scala

目前我正在尝试使用Scala编写API。此API应处理文件后端,如Smb,S3,FileSystem Storage等。

所以我写了一些像Storage这样的类,它是存储后端的基类,而FileSystemStorageSmbStorage这样的子类是Storage的子类,但从现在开始,我如果我在设置文件中指定它们,我想使用这些类。

我希望它像在Django中一样:https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DEFAULT_FILE_STORAGE我可以指定一个字符串,到我的默认存储引擎。

然后它应该“神奇地”工作,以便我可以使用DefaultStorage访问FileSystemStorageSmbStorage,也应该可以创建更多“存储”类。这有可能吗?

目前我有一些想法可以实现这一点,但我不确定这是否是斯卡拉的好习惯。

1 个答案:

答案 0 :(得分:1)

JVM类已经动态加载。你想要的是动态选择一个实例。

您可以执行以下操作:

def byName(name:String) = name match {
  "FileSystemStorage" => FileSystemStorage
  "SmbStorage" => SmbStorage
}

我假设这些是对象。如果他们是课程,只需添加new关键字。

现在,如果在编译时类名未知,则可以执行Class.forName(full_qualified_classname)。但是这会给你一个Class对象,而不是类的实例,在这种情况下你需要调用newInstance(假设它有一个无参数的构造函数)。您描述问题的方式表明您不希望采用这种方法。