Есть ли что-то вроде интерактивного режима REPL в Python, но для Java?
Чтобы я мог, например, набрать InetAddress.getAllByName( localHostName ) в окне и сразу же получить результаты, без всей этой публичной статической пустоты nightmare ()?
Java представляет это в JDK-9: JEP 222: jshell: оболочка Java




В большинстве IDE есть окно, называемое чем-то вроде «немедленный режим», которое позволяет вам оценивать Java-код на лету.
У Eclipse есть "дисплейный" вид, который близок к тому, что я хочу. Проблема в том, что это должно быть в контексте запущенного приложения. Мне нужно запустить приложение, остановиться на точке останова, и только тогда я могу ввести то, что хочу.
@YoniRoit IMHO Мне больше нравится "отображение" + режим отладки, чем REPL в командной строке. Я использовал REPL с Python давным-давно, так что сделал и то, и другое. Я думаю, что гораздо лучше написать модульный тест и разместить точку останова и поиграть с желаемым контекстом, вставляя любой работающий код обратно в модульный тест. Получить точный контекст в простом REPL намного сложнее, чем, скажем, в модульном тесте.
Jython - это реализация на Python, которая позволяет вам проверять объекты Java и взаимодействовать с ними.
>>> from java.net import *
>>> InetAddress.getAllByName("google.com")
array(java.net.InetAddress,[google.com/209.85.171.100,
google.com/74.125.45.100,
google.com/74.125.67.100])
редактировать Начиная с Java 9 есть JShell
Исходный ответ следует
Вы также можете использовать Groovy Console. Это интерактивная консоль, где вы можете делать то, что хотите. Поскольку Groovy также включает классы из базовой платформы Java, вы также сможете использовать эти классы.
Выглядит это так:

Скриншот больше не существует на imageshack.
Что особенно приятно в Groovy-консоли, так это то, что по умолчанию импортируется гораздо больше пакетов (например, java.util. *), Поэтому вам не нужно писать так много операторов импорта
Для тех, кому лень устанавливать Groovy, доступна онлайн-версия этой консоли: groovyconsole.appspot.com. Некоторые библиотеки JDK недоступны (например, ввод-вывод и System.exit()), но для большинства целей этого должно быть достаточно.
Это не принимает классы, это нормально? class test{public static void test(){System.out.println('test')}}
отличная консоль позволяет вам это делать. На самом деле он был предназначен для того, чтобы попробовать и протестировать отличный код, но, поскольку groovy - это надмножество Java, он также позволяет использовать простые Java-материалы.
Я просто ввел это в консоль:
InetAddress.getAllByName('localhost')
и нажмите CTRL-R, затем он вернется:
groovy> InetAddress.getAllByName('localhost')
Result: [localhost/127.0.0.1]
Clojure предоставляет REPL, который вы можете использовать.
В качестве альтернативы Groovy попробуйте Beanshell: http://www.beanshell.org/
Он больше похож на Java и позволяет напрямую использовать Java-синтаксис.
Поддерживается ли бобовая оболочка?
BeanShell активно поддерживается как beanshell 2 - code.google.com/p/beanshell2
@hshib: Нет. Последний коммит на github датируется 2013 годом.
Scala также предлагает интерактивную консоль. Я смог использовать его, чтобы получить результат для выражения в вашем вопросе, полностью определив InetAddress, как в:
java.net.InetAddress.getAllByName("localhost")
Для людей, имеющих доступ к Mathematica, JLink позволяет получить доступ к Java и скриптам с кодом Mathematica:
Needs["JLink`"]
LoadJavaClass["java.net.InetAddress"]
InetAddress`getAllByName["localhost"]
Нажмите Shift-Enter, чтобы оценить, и вы получите
{<<JavaObject[java.net.Inet4Address>>}
Затем вы можете использовать функцию Map в системе Mathematica для вызова toString для возвращаемых объектов:
#@toString[]& /@ %
чтобы получить результат (или использовать менее запутанный синтаксис Map[Function[obj, obj@toString[]], %]):
{"localhost/127.0.0.1"}
Если вы начнете серьезно относиться к этому, вы захотите прочитать учебник Тодда Гейли на http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html.
В Eclipse есть функция для этого, хотя это не цикл. Это называется «Страница альбома для вырезок». Я предполагаю, что аналогия должна заключаться в том, что у вас есть альбом для вырезок, в котором вы собираете небольшие фрагменты кода.
В любом случае, чтобы он заработал, откройте проект в Eclipse (ваша страница Scrapbook будет связана с проектом - Eclipse нравится, когда проекты принадлежат вещам).
Потом:
Теперь у вас есть страница альбома для вырезок. Введите код, например, такой:
System.out.println(System.getProperties());
Затем выделите текст с помощью мыши и либо нажмите Control-U, либо выберите «Выполнить» в контекстном меню. Код будет запущен, и результат появится на консоли.
Вы также можете ввести выражение, выбрать его и выбрать «Показать» в контекстном меню. Он оценит выражение и напечатает его тип. Например, при запуске Display на 1 + 2 будет напечатан (int) 3.
Спасибо за это. Для меня Beanshell задерживался на всплеске, но это отлично работает.
Я так давно использую Eclipse, но не знал об этом, спасибо!
Вы можете взглянуть на BlueJ, интерактивную среду разработки Java, предназначенную для обучения ООП, а не как полноценную IDE, такую как Eclipse или NetBeans. В любом случае это довольно забавно.
Вы можете увидеть это в действии на YouTube в серии руководств по Java.
это интересно. Bluej похож на оперативного ответа. Не очень полезно для вещей, для которых вы в настоящее время используете repl, но вы можете использовать его для прототипирования вашего oo-дизайна, как вы использовали бы repl для прототипа метода.
BeanShell is a small, free, embeddable Java source interpreter with object scripting language features, written in Java. BeanShell dynamically executes standard Java syntax and extends it with common scripting conveniences such as loose types, commands, and method closures like those in Perl and JavaScript. You can use BeanShell interactively for Java experimentation and debugging as well as to extend your applications in new ways. Scripting Java lends itself to a wide variety of applications including rapid prototyping, user scripting extension, rules engines, configuration, testing, dynamic deployment, embedded systems, and even Java education.
http://www.beanshell.org/manual/syntax.html#Standard_Java_Syntax
Существуют также интерактивные оболочки Jython и JRuby для менее подробного синтаксиса.
BeanShell активно поддерживается как beanshell 2 - code.google.com/p/beanshell2
Простой пример запуска beanshell из командной строки можно найти здесь
@hshib: Сейчас это Github, а последняя фиксация сделана в 2013 году. Это нет «активно поддерживается».
@ MartinSchröder, этот комментарий БЫЛ В 2013 году :-)
Я провел некоторое исследование состояния BeanShell пару лет назад в ответ на stackoverflow.com/questions/26549307/current-state-of-beansh эл. пару лет назад.
Если вы уже знаете Groovy (что, я полагаю, вы знаете, поскольку вы упомянули Groovy Console), просто используйте groovysh или groovyConsole, которые включены в дистрибутив Groovy. Если у вас есть пользовательские jar-файлы, которые вы хотите импортировать, вы можете написать командный файл, который запускает groovysh / groovyConsole с теми, которые добавлены в путь к классам. Вы также можете сделать это
this.class.classLoader.rootLoader.addURL(new URL("file:///path to file"))
изнутри оболочки, чтобы загрузить другие банки.
Несколько лет назад я использовал Jython, чтобы делать то, о чем вы просите. В рамках моего сценария сборки я создал пользовательские файлы jython.bat и .py, которые включали полный путь к классам для проекта, над которым я работал. Таким образом, когда я запустил Jython, у него был бы весь доступный код, и он запустил бы Spring, чтобы я мог вертеться в реальной системе. То же самое можно сделать с Groovy, JRuby, BeanShell и т. д.
Я знаю, что могу использовать Groovy-оболочку, но Groovy не имеет точно такой же семантики, как Java, и не имеет проверки типов. Так что вполне возможно, что я мог получить ошибки компиляции или другое поведение во время выполнения с фрагментом кода Java, который, казалось, работал в оболочке Groovy.
Groovy также загрузит все библиотеки в ~ / .groovy / lib, вы можете либо скопировать туда файлы, либо использовать символические ссылки
Jython, JIRB для JRuby, Groovy (groovyconsole и др.) И Beanshell - все это жизнеспособные варианты.
Я использовал InteractiveConsole для Jython, он действительно отлично работал в приложении.
вы можете создать скрипт java, используя jruby http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby
DrJava - это образовательная среда IDE, которая включает панель REPL.
Также есть плагин Eclipse, но он у меня не сработал. Я думаю, что он просто не обновлялся какое-то время. Итак, что я обычно делаю, так это оставляю окно DrJava открытым для вопросов «что произойдет, если я сделаю это».
EclipseShell тоже может подойти, но я еще не использовал его.
Вы можете использовать страницы Eclipse Scrapbook.
В Eclipse создайте страницу альбома для вырезок. В вашем проекте, New-> Other-> Scrapbook page.
В файле введите текст, выделите его и нажмите ctrl-U, и все готово.
Чтобы управлять импортом, щелкните страницу правой кнопкой мыши и выберите «Установить импорт», где вы можете выбрать импорт пакета или отдельного класса. Это постоянно и сохраняется вместе со страницей.
Как бы полезно это ни было, страница альбома для вырезок не является постоянным сеансом, поэтому на самом деле она не очень хорошо работает в качестве REPL.
Не поддерживается.
Кажется, никто еще не упомянул, что Java (6, 7) поставляет консоль REPL под названием jrunscript. Он не зависит от языка (поэтому может использоваться с Jython, JRuby и т. д.). По умолчанию используется JavaScript (Rhino), который также включен по умолчанию, и, как и в других языках, вы можете получить доступ ко всем пакетам / объектам, доступным в пути к классам.
Хотя присутствуют JRuby, BeanShell, REPL Джулиана Флейшера, REPL Альберта Латача кажется последним и активным.
Пробовал с простым определением класса, отлично работает.
$ java -jar javarepl.jar
Welcome to JavaREPL version 56 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17)
Type in expression to evaluate.
Type :help for more options.
java> public class Test {
| public static void execute(String [] s) {
| System.out.println(54353 + s[0]);
| }}
java> Test.execute(new String [] {"234343"});
54353234343
java> System.exit(0);
Старый вопрос, но теперь есть лучший ответ (май 2013 г.) - java-REPL! Он доступен на github, а также доступен в прямом эфире на сайт java-repl для быстрого одноразового тестирования.
Если вы возьмете код концентратора git и запустите ant для генерации артефактов, вы можете упростить его использование с помощью небольшого скрипта, например:
#!/bin/sh
java -jar /home/rdahlgren/scripts/javarepl-dev.build.jar
С тех пор, как нашел этот проект, я, наверное, использую его 5 раз в день. Наслаждаться!
Ссылка для онлайн-ответа теперь кажется javarepl.com/term.html, старая ссылка просто показывает ошибки Java.
Существует простая среда IDE под названием DrJava, которая имеет консоль взаимодействия. Это работает именно так, как я ожидал. Просто загрузите файл и начните взаимодействовать с находящимися в нем объектами.
Java-REPL от Альберт Латач работает хорошо.
Вы можете попробовать это прямо в браузере здесь: http://www.javarepl.com/term.html
Исходный код доступен здесь, и у него есть достойный плагин Intelli-J.
REPL под названием JShell (разработанный Oracle) был выпущен как часть JDK 9.
Просто скачайте JDK 9 и запустите bin/jshell.
Есть онлайн-REPL: http://www.javarepl.com/console.html
Печатать больше, чтобы достичь максимального количества символов ...
Для java 8 есть nudge4j. см. https://github.com/lorenzoongithub/nudge4j
... и прелесть в том, что вы можете пилотировать свое приложение прямо из браузера
JPad - это блокнот Java со встроенным REPL:
C:\>jpad
_ _____ _
| | __ \ | |
| | |__) |_ _ __| |
_ | | ___/ _` |/ _` |
| |__| | | | (_| | (_| |
\____/|_| \__,_|\__,_|
Anything you type is evaluated as java.
The code is continuously appended until you call \clear.
Other Available Commands:
\exit - exit
\clear (n) - clear past java statements
\history - display all past java statements
\help - display this help
j>2+2
4
j>Math.sin(100.1)
-0.4177477
j>
Он также умеет сбрасывать коллекции, списки, карты и т. д. И позволяет отображать их в виде таблицы или диаграммы:
Java 9 предоставляет JShell.
jshell> println( "Print me!")
jshell> Print me!
Да, есть: scravy.de/blog/2012-02-27/a-read-eval-print-loop-for-java.ht m