Возможно ли в Java вызвать метод main другого класса и вернуться к вызывающему коду?

public class A{
    public static void main(String[] args)
    {
        //Main code
    }
}

public class B{
    void someMethod()
    {
        String[] args={};
        A.main();
        System.out.println("Back to someMethod()");
    }
}



Есть какой-либо способ сделать это? Я нашел способ сделать то же самое с помощью отражения, но это невернуться к вызывающему коду тоже. Я пытался с помощьюProcessBuilder выполнить его в отдельном процессе, но я думаю, что я что-то упустил.

 Blorgbeard13 июн. 2013 г., 21:56
Вы пробовали это? Конечновозможно,main это просто еще один метод.
 Aswin Parthasarathy13 июн. 2013 г., 22:02
Я должен извиниться здесь. Мой метод main () в конце имеет вызов System.exit (), и этопочему это не таквернуться к вызывающему коду. Я просто заметил это. Думаю, это делает этот вопрос бесполезным.
 Russell Uhl13 июн. 2013 г., 22:00
Вы упомянули ProcessBuilder. Вы пытаетесь запустить второй экземпляр программы в целом? Или вы пытаетесь запустить новую программу из другой?

Ответы на вопрос(5)

На самом деле, вы можете позвонитьmain метод, как вы только что спросили, но не так, как вы это сделали. Во-первых, каждый процесс запуска начинается сmain метод. Итак, если вы хотите сделать это так, как вы хотите, вы можете сделать это правильно. Этот код будет выполнятьсяHello! World восемь раз:

class B
{
  B()
  {
    while(A.i

Да, вы можете сделать звонок.A.main()

Вы можете сделать это:

String[] args = {};
A.main(args);

Если вы нене заботьтесь об аргументах, тогда вы можете сделать что-то вроде:

public static void main(String ... args)

и назовите это с:

A.main(); //no args here
 Aswin Parthasarathy13 июн. 2013 г., 22:17
Я был в этом проблема. Я не'я не заметил, что в конце у него был System.exit () и чтопочему запутался и написал.

Там'Ничего волшебного в имени "главный", Что ты'Вы должны сделать набросок, поэтому ваша проблема должна быть в другом. Проверьте мою заявку, изменив имя "главный" к чему-то еще, держу пари, что это все еще нет работа.

Решение Вопроса

Ваш код уже почти делает это - этопросто не передавая аргументы:

String[] args = {};
A.main(args);

main метод толькоспециальный" с точки зрения того, что это рассматривается как точка входа. Это'В противном случае это совершенно нормальный метод, который можно без проблем вызвать из другого кода. Конечно, вы можете столкнуться с проблемами, если этонаписано таким образом, чтонадеется он должен вызываться только как точка входа (например, если он используетSystem.exit) но с точки зрения языка этохорошо.

 Jabari21 сент. 2016 г., 07:29
Если вы неУ меня нет никаких аргументов, я полагаю, вы можете просто пропустить null.
 flow2k25 окт. 2018 г., 21:02
Спасибо за разъяснение. Но возникает вопрос: а что если яя пытаюсь написать модульный тест для метода, который вызываетSystem.exit()? Этот метод имеет некоторые ожидаемые побочные эффекты, такие как написание файла, что и должно проверяться тестом.
 Jon Skeet13 июн. 2013 г., 21:57
@AswinParthasarathy: Это произойдет, если ваш код явно не убивает JVM. Но ты нет показал нам этот код.
 Aswin Parthasarathy13 июн. 2013 г., 22:00
@ Джон Скит: Ах, да. Я'мы уже поняли этоглупый вопрос. Мой класс выходит, и этопочему это не такт вернуться
 Jabari21 сент. 2016 г., 17:00
@ Джон Скит Правда! В этом случае его метод A.main () нене говоря уже о том, чтобы возиться с аргументами, так что передача значения null не принесет вреда. Тем не менее, передача пустых аргументов, безусловно, является более безопасным решением.
 SLaks13 июн. 2013 г., 21:57
@AswinParthasarathy: это произойдет, если другойmain() завершает программу Дон»сделать это.
 Jon Skeet21 сент. 2016 г., 07:31
@Jabari: Ну, это зависит от того, чтоmain делает. Если только этонаписаносправиться args будучи нулевым, это 'очень вероятно, что выв конечном итоге сNullPointerException, как обычно.
 Jon Skeet25 окт. 2018 г., 21:28
@ flow2k: Вы можете настроить диспетчер безопасности так, чтобы System.exit ничего не делал, но я нене имею опыта этого. Я'я обычно использую внедрение зависимостей, чтобы абстрагироваться от понятия "то, что может выйти из процесса и иметь поддельную реализацию, которую вы можете использовать в своих тестах.
 Aswin Parthasarathy13 июн. 2013 г., 21:57
Я хочу вернуться к someMethod () после выполнения main. Прямо сейчас это нет.

Конечно. String [] args = {}; A.main (арг);

Просто имейте в виду: если исходить из того, что у вас есть, основным методом остается точка входа в программу. Теперь, если вы пытаетесь запустить метод main в новом PROCESS, это другая история.

Ваш ответ на вопрос