В Java я загружаю внешний класс (в .jar файл) следующим образом:
ClassLoader classLoader = new URLClassLoader(new URL[] {
new File("module.jar").toURI().toURL()});
Class clazz = classLoader.loadClass("my.class.name");
Object instance = clazz.newInstance();
//check and cast to an interface, then use it
if (instance instanceof MyInterface)
...
И он отлично работает.
====================
Теперь я хочу сделать то же самое в Scala. У меня есть trait
с именем Module
(Module.scala
):
trait Module {
def name: String
}
object Module {
lazy val ModuleClassName = "my.module.ExModule"
}
Я пишу модуль, расширяющий Module
, затем скомпилируем его в module.jar
:
package my.module
import Module
object ExModule extends Module {}
Затем я загружаю его с помощью этого кода:
var classLoader = new URLClassLoader(Array[URL](
new File("module.jar").toURI.toURL))
var clazz = classLoader.loadClass(Module.ModuleClassName)
Он отлично работает. Но если я создаю новый экземпляр, я получаю это исключение:
java.lang.InstantiationException: my.module.ExModule
Если я его протестирую:
clazz.isInstanceOf[Module]
- > всегда возвращать false
.
Так вы могли бы помочь мне в решении этой проблемы?
Edited
Я думаю, это потому, что ExModule
является object
(не class
). Но когда я меняю его на class
, а classLoader.loadClass(...)
вызывает a java.lang.NoClassDefFoundError
. Я думаю, это потому, что ExModule
расширяется от a trait
.
Я в замешательстве. Может ли кто-нибудь помочь мне?
Edited
clazz.isInstanceOf[Class[Module]]//or Class[Byte], or Class[_]...
возвращает true
.