Могу ли я вызвать метод java, отличный от main(), из командной строки?
Могу ли я вызвать метод java, отличный от main(), из командной строки?
Google не так откровенен с этой информацией.
Спасибо
8 ответов
Если вы устанавливаете REPL для языка JVM (Groovy, вероятно, требует меньше усилий, чтобы начать работу), то вы можете вызывать методы Java в приглашении REPL (Groovy называется groovysh). groovysh
имеет некоторые странные особенности (мой наименее любимый бит в том, что объявление переменных с def
не делает то, что вы думаете, это должно), но это все еще действительно полезно. Это интересная особенность, что Groovy не уважает конфиденциальность, поэтому вы можете вызывать приватные методы и проверять содержимое приватных переменных.
Groovy установки включают в себя Groovysh. Скачайте zip-файл, распакуйте его куда-нибудь, добавьте местоположение каталога bin в путь, и все готово. Вы можете поместить jar в папку lib для кода, который вы запускаете, и библиотек, используемых этим кодом, и Groovy найдет их там.
Если у вас нет основной функции, вы можете просто добавить ее, а если она у вас есть, вы можете просто добавить серию блоков 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
Запустим ваш метод.
Это довольно глупо - я почти уверен, что это не то, что вы хотите сделать, но, эй, это отвечает на вопрос, верно?
Вот функция 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()'
Это взлом, конечно, но это работает.
Из спецификации виртуальной машины Java
Виртуальная машина Java запускается путем создания начального класса, который определяется способом, зависящим от реализации, с помощью загрузчика классов начальной загрузки (§5.3.1). Затем виртуальная машина Java связывает исходный класс, инициализирует его и вызывает метод открытого класса void main(String[]). Вызов этого метода приводит к дальнейшему выполнению. Выполнение инструкций виртуальной машины Java, составляющих основной метод, может вызвать связывание (и, следовательно, создание) дополнительных классов и интерфейсов, а также вызов дополнительных методов.
Так что главное кажется особенным.
Нет ты не можешь
В соответствии с часто задаваемыми вопросами по командной строке Java (которые сейчас не работают).
Метод точки входа main() используется для предоставления стандартного соглашения для запуска программ на Java. Выбор имени метода несколько произвольный, но он частично разработан, чтобы избежать конфликтов, например, с методами Thread start() и Runnable run().
Проверьте FAQ. Вы получите хорошие знания о командной строке JAVA
Вы не можете вызвать даже основной метод из команды. JVM вызывает основной метод. Это просто соглашение. Это всегда должно быть "public static void main".
Какой у вас вариант использования?
Нет, я так не думаю. main() является точкой входа. Это определяется языком. Вы можете, конечно, обернуть скрипт в вызов main () ("java MyApp arg1...argn"), чтобы скрыть имя (и даже скрыть, что вы используете Java) и предоставить собственный синтаксис и синтаксический анализ параметров. - это возможность, предоставляемая ОС, конечно, с помощью своего рода языка сценариев командной строки.
Если вы используете Java для создания других типов исполняемых файлов, таких как апплеты или приложения GWT, тогда точка входа будет другой, но я думаю, что вы думаете конкретно об исполняемых файлах, запускаемых из командной строки.
Нет, это невозможно.
Пожалуйста, смотрите спецификацию языка Java
https://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html
Конечно, апплеты и сервлеты и другие технологии могут иметь разные отправные точки.