В 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
.
ТакНе могли бы вы помочь мне в этой проблеме?
Отредактировано
Я думаю, это потому, что ExModule
является object
(не class
).Но когда я изменяю его на class
, а classLoader.loadClass(...)
поднимает java.lang.NoClassDefFoundError
.Я думаю, это потому, что ExModule
расширен от trait
.
Я в замешательстве.Может ли кто-нибудь помочь мне?
Отредактировано
clazz.isInstanceOf[Class[Module]]//or Class[Byte], or Class[_]...
возвращает true
.