将 Scala 反射用于插件架构

Using Scala Reflection for a plugin architecture

我正在构建一个使用插件架构的 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 Reflection API 来代替我对 URLClassLoader 的使用,如果可以,我应该怎么做?

为了使 Scala 反射 API 的运行时反射部分工作,您无论如何都需要实例化一个类加载器(然后 scala.reflect.runtime.universe.runtimeMirror(classloader)),所以我认为它不会进行简化这种情况下的事情。