Почему JavaFX Application.launch() принимает класс в качестве аргумента?
Я новичок в javaFx и немного заглянул в исходный код и у меня есть вопрос, касающийся функции Application.launch, которая используется для запуска приложения.
Подпись выглядит так:
public static void launch(Class<? extends Application> appClass, String... args)
И мой вопрос, почему это не выглядит так:
public static void launch(Application app, String... args)
Чего пытаются достичь авторы, принимая класс в качестве аргумента?
4 ответа
Потому что экземпляр Application
это сложная задача, которую разработчики FX должны контролировать.
Application
конкретизации:
- требует, чтобы "FX toolkit" был инициализирован заранее
- отличается для режимов рабочего стола, jnlp и плагина
- требует определенного времени
- должен вызываться в специальном потоке "launcher"
- должен вызывать события жизненного цикла приложения
- следует прочитать параметры приложения (из файла CLI или jnlp)
Таким образом, вы предоставляете только имя класса для запуска, а JavaFX выполняет всю необходимую работу, включая создание объекта для вас.
Я думаю, что одна из причин заключается в том, что таким образом он работает так, как если бы вы могли запускать напрямую через "java my.pkg.MyApp", который теперь можно использовать в Java8/FX8, потому что он находится на пути к классам.
Для точного ответа вам, вероятно, придется спросить в списке рассылки openjfx.
Вероятно, они используют Reflection под капотом. Примерно так: получить имя класса в качестве аргумента launch()
затем позвоните start()
этого класса.
Как и в случае с другими вопросами на стеке, где люди спрашивают, чего пытались достичь авторы, мы не осведомлены о принимаемых ими решениях.
Аргумент class обозначает непосредственно включающий класс метода, который вызвал launch