Есть ли что-то вроде интерактивного режима REPL в Python, но для Java?


92

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



3
Java представляет это в JDK-9 : JEP 222: jshell: Java Shell
не ошибка

Ответы:


64

edit Начиная с Java 9 есть JShell

Оригинальный ответ следует

Вы также можете использовать Groovy Console . Это интерактивная консоль, где вы можете делать то, что хотите. Поскольку Groovy также включает классы из базовой платформы Java, вы также сможете использовать эти классы.

Выглядит это так:

Скриншот Groovy


Скриншот больше не существует на imageshack.

Что особенно приятно в Groovy-консоли, так это то, что по умолчанию импортируется гораздо больше пакетов (например, java.util. *), Поэтому вам не нужно писать так много операторов импорта
Донал

2
Для тех, кому лень устанавливать Groovy, есть онлайн-версия этой консоли, доступная здесь: groovyconsole.appspot.com . Некоторые библиотеки JDK недоступны (например, ввод-вывод и System.exit()), но для большинства целей этого должно быть достаточно.
Dónal

Это не принимает классы, это нормально? class test{public static void test(){System.out.println('test')}}
Лайм

52

В Eclipse есть функция для этого, хотя это не цикл. Это называется «Страница альбома для вырезок». Я предполагаю, что аналогия должна заключаться в том, что у вас есть альбом для вырезок, в котором вы собираете небольшие фрагменты кода.

В любом случае, чтобы он заработал, откройте проект в Eclipse (ваша страница Scrapbook будет связана с проектом - Eclipse нравится, когда проекты принадлежат объектам).

Затем:

  1. В окне навигатора проекта выберите папку, которая существует где-то в вашем проекте.
  2. Либо выберите меню File -> New -> Other, либо нажмите Control-N.
  3. Выберите Java -> Java Run / Debug -> Scrapbook Page.
  4. Нажмите «Далее», затем дайте ему имя файла, затем нажмите «Готово».

Теперь у вас есть страница альбома для вырезок. Введите код, например, такой:

System.out.println(System.getProperties());

Затем выделите текст мышью и либо нажмите Control-U, либо выберите «Выполнить» в контекстном меню. Код будет запущен, и результат появится на консоли.

Вы также можете ввести выражение, выбрать его и выбрать «Показать» в контекстном меню. Он оценит выражение и напечатает его тип. Например, при запуске Display on 1 + 2будет печататься (int) 3.


1
Спасибо за это. Для меня Beanshell задерживался во всплеске, но это отлично работает.
Bayard Randel,

3
Я так давно использую Eclipse, но не знал об этом, спасибо!
Tobold

28

BeanShell - это небольшой бесплатный встраиваемый интерпретатор исходного кода Java с функциями языка объектных сценариев, написанный на Java. BeanShell динамически выполняет стандартный синтаксис Java и расширяет его за счет обычных средств создания сценариев, таких как свободные типы, команды и закрытие методов, как в Perl и JavaScript. Вы можете использовать BeanShell в интерактивном режиме для экспериментов и отладки Java, а также для расширения ваших приложений новыми способами. Создание сценариев Java подходит для широкого спектра приложений, включая быстрое создание прототипов, расширение пользовательских сценариев, механизмы правил, конфигурацию, тестирование, динамическое развертывание, встроенные системы и даже обучение Java.

http://www.beanshell.org/

http://www.beanshell.org/manual/syntax.html#Standard_Java_Syntax


Существуют также интерактивные оболочки Jython и JRuby для менее подробного синтаксиса.
bakkal

1
BeanShell активно поддерживается как beanshell 2 - code.google.com/p/beanshell2
hshib

Простой пример запуска beanshell из командной строки можно найти здесь
Брэд Паркс,

@hshib: Сейчас он на Github, а последний коммит от 2013 года. Это не "активно поддерживается".
Мартин Шредер

@ MartinSchröder, этот комментарий БЫЛ в 2013 году :-)
hshib

19

Вы можете использовать страницы Eclipse Scrapbook.

В Eclipse создайте страницу альбома для вырезок. В вашем проекте, New-> Other-> Scrapbook page.

В файле введите текст, выберите его и нажмите ctrl-U, и готово.

Чтобы управлять импортом, щелкните страницу правой кнопкой мыши и выберите «Установить импорт», где вы можете выбрать импорт пакета или отдельного класса. Это постоянно и сохраняется вместе со страницей.


3
Как бы полезно это ни было, страница альбома для вырезок не является постоянным сеансом, поэтому на самом деле не очень хорошо работает в качестве REPL.
MHarris

19

Старый вопрос, но теперь есть лучший ответ (май 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.
Тони

13

Кажется, никто еще не упомянул, что Java (6, 7) поставляет консоль REPL с именем jrunscript. Он не зависит от языка (поэтому может использоваться с Jython, JRuby и т. Д.). По умолчанию используется JavaScript (Rhino), который также включен по умолчанию, и, как и в других языках, вы можете получить доступ ко всем пакетам / объектам, доступным в пути к классам.


12

Это часть OpenJDK 9!

REPL под названием JShell (разработанный Oracle) был выпущен как часть JDK 9.

Просто скачайте JDK 9 и запустите bin/jshell.

Снимок экрана JShell

Ресурсы


11

В качестве альтернативы Groovy попробуйте Beanshell: http://www.beanshell.org/

Он больше похож на Java и позволяет напрямую использовать синтаксис Java.


Поддерживается ли beanshell?
rogerdpack

1
BeanShell активно поддерживается как beanshell 2 - code.google.com/p/beanshell2
hshib

@hshib: Нет. Последний коммит на github
Мартин Шредер,

11

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])



7

Консоль заводной позволяет сделать это. На самом деле он был предназначен для того, чтобы попробовать и протестировать отличный код, но, поскольку groovy является надмножеством Java, он также позволяет использовать простые Java-материалы.

Я просто ввел это в консоль:

InetAddress.getAllByName('localhost')

и нажмите CTRL-R, затем он вернется:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]

7

Scala также предлагает интерактивную консоль. Я смог использовать его, чтобы получить результат для выражения в вашем вопросе, полностью определив InetAddress, как в:

java.net.InetAddress.getAllByName("localhost")

6

В то время как JRuby , BeanShell , Джулиан Флейшер в РЕПЛ есть РЕПЛ Альберт Latacz по - видимому, последние и активные.

Пробовал с простым определением класса, отлично работает.

$ 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);

3

Для людей, имеющих доступ к 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 .


2

Если вы уже знаете 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, вы можете либо скопировать туда файлы, либо использовать символические ссылки
Джейсон,



1

В большинстве IDE есть окно, называемое чем-то вроде «немедленный режим», которое позволяет вам оценивать Java-код на лету.


У Eclipse есть "отображение", которое близко к тому, что я хочу. Проблема в том, что это должно быть в контексте работающего приложения. Мне нужно запустить приложение, остановиться на точке останова, и только тогда я могу ввести то, что хочу.
Йони Ройт

@YoniRoit IMHO Мне больше нравится "отображение" + режим отладки, чем REPL в командной строке. Я использовал REPL с Python давным-давно, так что сделал и то, и другое. Я думаю, что гораздо лучше написать модульный тест и поставить точку останова и поиграть с желаемым контекстом, вставляя любой работающий код обратно в модульный тест. Получить точный контекст в простом REPL намного сложнее, чем, скажем, в модульном тесте.
Адам Гент

1

Вы можете взглянуть на BlueJ , интерактивную среду разработки Java, предназначенную для обучения ООП, а не на полноценную среду IDE, такую ​​как Eclipse или NetBeans. В любом случае это довольно забавно.

Вы можете увидеть это в действии на YouTube в серии руководств по Java.


это интересно. Bluej похож на оперативного ответа. Не очень полезно для вещей, для которых вы сейчас используете repl, но вы можете использовать его для прототипирования своего oo-дизайна, как вы использовали бы repl для прототипа метода.
Bill K

1

DrJava - это образовательная IDE, которая включает панель REPL.

Также есть плагин Eclipse, но он у меня не сработал. Я думаю, что его просто не обновляли какое-то время. Итак, что я обычно делаю, так это оставляю окно DrJava открытым для вопросов «что произойдет, если я сделаю это».

EclipseShell тоже может подойти, но я еще не использовал его.



1

Существует простая среда IDE DrJava с консолью взаимодействия. Это работает именно так, как я ожидал. Просто загрузите файл и начните взаимодействовать с находящимися в нем объектами.




1

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>

Он также умеет сбрасывать коллекции, списки, карты и т. Д. И позволяет отображать их в виде таблицы или диаграммы:

введите описание изображения здесь



0

Jython, JIRB для JRuby, Groovy (groovyconsole и др.) И Beanshell - все это жизнеспособные варианты.

Я использовал InteractiveConsoleдля Jython, он действительно отлично работал в приложении.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.