【问题标题】:Using Scala Reflection for a plugin architecture将 Scala 反射用于插件架构
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2015-04-09
      • 2020-11-19
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多