2015-02-12 26 views
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的,如果所以,我該怎麼做?

回答

0

爲了使Scala反射API的運行時反射部分正常工作,您無論如何都需要實例化一個類加載器(然後執行scala.reflect.runtime.universe.runtimeMirror(classloader)),所以我認爲在這種情況下它不會簡化問題。