Могу ли я вызвать метод java, отличный от main (), из командной строки? - PullRequest
35 голосов
/ 08 ноября 2011

Могу ли я вызвать метод java, отличный от main (), из командной строки?

Google не так откровенен с этой информацией.

Спасибо

Ответы [ 8 ]

13 голосов
/ 08 ноября 2011

Если у вас нет основной функции, вы можете просто добавить ее, а если у вас есть, вы можете просто добавить серию блоков if-then в начало.

public static void main(String[] args){
    if (args[0].equals("MY_METHOD"))
        callMyMethod();
    else if(args[0].equals("MY_OTHER_METHOD"))
        callMyOtherMethod();
    //... Repeat ad nauseum...
    else {
        //Do other main stuff, or print error message
    }
}

Затем,из командной строки:

$ java [MyPackage.]MyClass MY_METHOD

Запустит ваш метод.

Это довольно хакерский - я почти уверен, что это не то, что вы хотите сделать, но эй, это отвечает на вопрос, верно?

10 голосов
/ 12 ноября 2012

Если вы устанавливаете REPL для языка JVM (Groovy, вероятно, потребует меньше всего усилий для начала работы), то вы можете вызывать методы Java в приглашении REPL (Groovy называется groovysh).groovysh имеет некоторые странные особенности (мой нелюбимый бит в том, что объявление переменных с def не делает то, что вы думаете, что должно), но это все еще действительно полезно.Это интересная особенность, что Groovy не уважает конфиденциальность, поэтому вы можете вызывать приватные методы и проверять содержимое приватных переменных.

Установки Groovy включают в себя groovysh.Скачайте zip-файл, распакуйте его куда-нибудь, добавьте местоположение каталога bin в путь, и все готово.Вы можете поместить файлы jar в папку lib для кода, который вы запускаете, и библиотек, используемых этим кодом, и Groovy найдет их там.

4 голосов
/ 30 апреля 2017

Вот функция bash, которая позволяет вам сделать это:

function javae {
  TDIR=`mktemp -d`
  echo "public class Exec { public static void main(String[] args) throws Exception { " $1 "; } }" > $TDIR/Exec.java && javac $TDIR/Exec.java && java -cp $CLASSPATH:$TDIR Exec;
  rm -r $TDIR;
}

Поместите это в ~ / .bashrc, и вы можете сделать это:

javae 'System.out.println(5)'

Или вот это:

javae 'class z { public void run() { System.out.println("hi"); } }; (new z()).run()'

Это, конечно, хак, но это работает.

3 голосов
/ 08 ноября 2011

С Спецификация виртуальной машины Java

Виртуальная машина Java запускается с созданием начального класса, который определяется в зависимости от реализации, используя загрузчик класса начальной загрузки (§5.3.1). Затем виртуальная машина Java связывает начальный класс, инициализирует его и вызывает метод public класса void main (String []). Вызов этого метода ведет все дальше выполнение. Выполнение инструкций виртуальной машины Java составляющий основной метод может вызвать связывание (и, следовательно, создание) дополнительных классов и интерфейсов, а также вызов дополнительных методов.

Так что main кажется особенным.

3 голосов
/ 08 ноября 2011

Нет, вы не можете

Согласно FAQ по командной строке Java (который сейчас мертв). Вы можете проверить FAQ по Java Threads

Метод точки входа main () используется для обеспечения стандартного соглашения для запуска программ на Java. Выбор имени метода несколько произвольный, но он частично разработан, чтобы, например, избежать конфликтов с методами Thread start () и Runnable run ().

Проверьте FAQ. Вы получите хорошие знания о командной строке JAVA

3 голосов
/ 08 ноября 2011

Вы не можете вызвать даже основной метод из команды. JVM вызывает основной метод. Это просто соглашение. Это всегда должно быть "public static void main".

Каков ваш вариант использования?

2 голосов
/ 08 ноября 2011

Нет, я так не думаю.main () является точкой входа.Это определяется языком.Конечно, вы можете обернуть скрипт в вызов main () («java MyApp arg1 ... argn»), чтобы скрыть имя (и даже скрыть, что вы используете Java) и предоставить собственный синтаксис и синтаксический анализ параметров.- это возможность, предоставляемая ОС, конечно, через некоторый язык сценариев командной строки.

Если вы используете Java для создания других типов исполняемых файлов, таких как апплеты или приложения GWT, то записьДело в другом, но я думаю, что вы думаете конкретно об исполняемых файлах, запускаемых из командной строки.

0 голосов
/ 08 ноября 2011

Нет, это невозможно.

См. Спецификацию языка Java

http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html

Конечно, апплеты и сервлеты и другие технологии могут иметь разные отправные точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...