1
我正在構建一個使用插件架構的應用程序Scala,並且我試圖在運行時加載插件。目前,我的插件加載器代碼是:使用Scala Reflection來實現插件架構
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是不是在classpath中,當應用程序啓動
我想知道是否有可能使用Scala的反射API來代替我使用URLClassLoader
的,如果所以,我該怎麼做?