Я не совсем согласен с Кевином. Есть несколько исключений. Например, я написал настольное приложение Scala. Я разделил ядро и модули на две части. Во время запуска ядро загружает все модули в графический интерфейс. В то время ядро просто получает имена модулей, ему не нужно что-то инициализировать. Затем я поместил код инициализации всего модуля в функцию init()
. Эта функция будет вызвана, когда пользователь выполнит модуль.
@ Freewind: Что касается отражения в Scala, то же самое в Java. Просто обратите внимание, что методы из Java, которые используются с отражением, используются для объектов Java, а не Scala. Я извиняюсь за мой английский. Я имею в виду, что эти методы не могут работать с Scala object
, trait
.
Например:
var classLoader = new java.net.URLClassLoader(
Array(new File("module.jar").toURI.toURL),
/*
* need to specify parent, so we have all class instances
* in current context
*/
this.getClass.getClassLoader)
var clazz = classLoader.loadClass("test.InitDb")
if (classOf[Init].isAssignableFrom(clazz))
var an_init = clazz.newInstance.asInstanceOf[Init];
Но вы не можете сделать это наоборот:
if (clazz.isAssignableFrom(classOf[Init]))
Поскольку Init
является trait
, а метод Java isAssignableFrom(Class)
не знает trait
.
Я не уверен, что мой вопрос полезен для вас, но здесь это .