【发布时间】:2015-04-12 20:01:45
【问题描述】:
我正在构建一个使用插件架构的应用程序 Scala,并且我正在尝试在运行时加载插件。目前,我的插件加载器代码是:
import org.clapper.classutil.ClassFinder
object PluginManager extends PluginManager {
val plugins = new mutable.HashMap[String, Plugin]()
val pluginFolder = new File("plugins")
def init(): Unit = {
val pluginJars = pluginFolder.listFiles.filter(_.getName.endsWith(".jar"))
val classpath = List(new File(".")) ++ pluginJars
val finder = ClassFinder(classpath)
val classes = finder.getClasses()
val classMap = ClassFinder.classInfoMap(classes.iterator)
val pluginsToLoad = ClassFinder.concreteSubclasses("org.narrativeandplay.hypedyn.plugins.Plugin", classMap)
val loader = new URLClassLoader(pluginJars.map({ f => new URL(s"file:${f.getAbsolutePath}") }), ClassLoader.getSystemClassLoader)
pluginsToLoad.foreach {
pluginString =>
val plugin = loader.loadClass(pluginString.name).newInstance().asInstanceOf[Plugin]
plugins += plugin.name -> plugin
}
}
}
(基于https://vikashazrati.wordpress.com/2011/09/15/building-a-plugin-based-architecture-in-scala/)。
我必须使用URLClassLoader,因为应用程序启动时我的插件 JAR 不在类路径中
我想知道是否可以使用 Scala 反射 API 来代替我对 URLClassLoader 的使用,如果可以,我应该怎么做?
【问题讨论】:
标签: scala dynamic reflection