Это вопрос интервью, на который меня спросили. Мы все знаем, что выполнение Java-программы начинается с основного метода со следующей сигнатурой:
public static void main(String[] arg)
Есть ли способ изменить начальную точку выполнения программы Java, на другой метод, скажем, путем настройки любых параметров конфигурации JVM?
Нет. Независимо от того, что приложение делает под обложками или как это может возникнуть, ваша программа должна содержать метод, объявленный public static void main(String[] args)
(или некоторое объявление vararg args
).
Это описано в разделе JLS, раздел 12:
Виртуальная машина Java запускается путем загрузки указанного класса и последующего вызова метода
main
в указанном классе.
Если main
не существует, возникает ошибка времени выполнения - в частности, NoSuchMethodError
(и он будет жаловаться на то, что не найдет main
).
Есть ли способ изменить начальную точку выполнения программы Java, на другой метод, скажем, путем настройки любых параметров конфигурации JVM?
Ответ - нет. вы не можете.
Когда обычный JVM начинает запускать класс, он ищет основной метод в классе. Это способ jvm.
Вы также можете добавить в свой ответ, что существуют другие модели исполнения для Java-программы. например, апплет, сервлет и т.д.
апплет будет запущен в браузере, который поддерживает jvm без основного метода. сервлет будет работать в контейнере сервлетов без основного метода.
То, что вы добавляете в статическом блоке, выполняется до основного... но все же класс не будет работать без main. Следовательно, теоретически можно изменить начальную точку java-программы, добавив статический блок, но выполнение программы завершится неудачей, если в классе нет основного.
Если вы хотите пойти дальше и показать, тогда вы можете сказать, что, поскольку main не является ключевым словом, мы можем изменить jvm-код, чтобы распознать другое имя метода вместо основного.. но для этого мы меняем код jvm.. не может пройти как параметр
Действительно, можно запускать приложение по любому из нескольких методов, все из которых называются main, выбирая класс, который имеет основное, что я хочу. Я делаю это все время для тестирования. Я бы рассмотрел этот метод как настройку параметров конфигурации JVM. Вот о чем говорится в документации по Java.
Applet
тожеApplet
, довольно простой способ.