我在 Scala 中实现了一个自定义类加载器,用于将插件与主应用程序隔离开来。目前,我需要一个 Java 接口作为共享根对象,以便我的主应用程序可以使用插件代码。
充当共享根的接口(我希望这是 Scala):
public interface Handler {
public List<HandlerInfo> getHandlers();
}
示例插件:
class MyPlugin extends Handler {
def getHandlers: java.util.List[HandlerInfo] = // get some handlers
}
应用中的用法:
val jarFile = new File(System.getProperty("user.dir") + "/plugins/" + jarName)
val cl = new PluginLoader(jarFile, this.getClass.getClassLoader) // my custom classloader
val classToLoad = Class.forName(className, true, cl)
val handler = classToLoad.newInstance.asInstanceOf[Handler]
val handlers = handler.getHandlers
这很好用,但我的问题是我必须保留这个 Java 类(以及生成的构建配置)。我想改为使用 Scala 特征或抽象类,如下所示:
trait Handler {
def getHandlers : List[HandlerInfo]
}
然后我的插件可能如下所示:
class MyPlugin extends Handler {
def getHandlers: List[HandlerInfo] = // no more java.util.List
}
但我不能这样做,因为这条线
val handler = classToLoad.newInstance.asInstanceOf[Handler]
抛出 a ClassCastException
,大概是因为 Scala 编译器没有生成漂亮干净的 Java 接口。有什么办法可以解决这个问题,所以我可以拥有一个仅限 Scala 的项目吗?