Existe algo como o modo REPL interativo do python, mas para o Java?

92

Existe algo como o modo REPL interativo do python, mas para o Java? Para que eu possa, por exemplo, digitar InetAddress.getAllByName( localHostName )em uma janela e obter resultados imediatamente, sem toda essa coisa de void nightmare () public static?

Yoni Roit
fonte
3
Java apresentando-o no JDK-9 : JEP 222: jshell: The Java Shell
Não é um bug

Respostas:

64

editar Desde Java 9 há JShell

A resposta original segue

Você também pode usar o Console Groovy . É um console interativo onde você pode fazer o que quiser. Como o Groovy também inclui classes da plataforma java principal, você também poderá usar essas classes.

Se parece com isso:

Captura de tela do Groovy

OscarRyz
fonte
A captura de tela não existe mais no imageshack.
O que é particularmente bom sobre o console bacana é que muitos mais pacotes são importados por padrão (por exemplo, java.util. *), Então você não precisa escrever tantas instruções de importação
Dónal
2
Para aqueles que têm preguiça de instalar o Groovy, há uma versão online desse console disponível aqui: groovyconsole.appspot.com . Algumas bibliotecas JDK não estão disponíveis (por exemplo, E / S e System.exit()), mas para a maioria dos propósitos deve ser adequado.
Dónal de
Isso não aceita aulas, isso é normal? class test{public static void test(){System.out.println('test')}}
Lima
52

O Eclipse tem um recurso para fazer isso, embora não seja um loop. É chamada de "Página do álbum de recortes". Suponho que a analogia é que você tem uma página de recados onde coleta pequenos trechos de código.

De qualquer forma, para fazer funcionar, abra um projeto no Eclipse (sua página do Scrapbook será associada a um projeto - o Eclipse gosta quando os projetos são donos das coisas).

Então:

  1. Na janela do navegador do projeto, selecione uma pasta que exista em algum lugar do seu projeto.
  2. Selecione o menu Arquivo -> Novo -> Outro ou pressione Control-N.
  3. Selecione Java -> Java Run / Debug -> Página do Scrapbook.
  4. Clique em "Avançar", atribua um nome de arquivo e clique em "Concluir"

Agora você tem uma página de scrapbook. Digite algum código, como talvez este:

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

Em seguida, selecione o texto com o mouse e pressione Control-U ou selecione "Executar" no menu de contexto. O código será executado e a saída aparecerá no console.

Você também pode digitar uma expressão, selecioná-la e selecionar Exibir no menu de contexto. Ele avaliará a expressão e imprimirá seu tipo. Por exemplo, rodar Display on 1 + 2irá imprimir (int) 3.


fonte
1
Obrigado por isso. Beanshell estava perdendo o tempo de respingo para mim, mas funciona perfeitamente.
Bayard Randel
3
Eu uso o Eclipse há muito tempo, mas não sabia sobre isso, obrigado!
Tobold de
28

BeanShell é um interpretador de código-fonte Java pequeno, gratuito e incorporável com recursos de linguagem de script de objeto, escrito em Java. O BeanShell executa dinamicamente a sintaxe Java padrão e a estende com conveniências de script comuns, como tipos soltos, comandos e encerramentos de método como aqueles em Perl e JavaScript. Você pode usar o BeanShell interativamente para experimentação e depuração de Java, bem como para estender seus aplicativos de novas maneiras. O script Java se presta a uma ampla variedade de aplicativos, incluindo prototipagem rápida, extensão de script do usuário, mecanismos de regras, configuração, teste, implantação dinâmica, sistemas incorporados e até mesmo educação Java.

http://www.beanshell.org/

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

Bakkal
fonte
Existem também shells interativos Jython e JRuby para sintaxes menos verbosas.
Bakkal
1
BeanShell é mantido ativamente como beanshell 2 - code.google.com/p/beanshell2
hshib
Um exemplo simples de execução de beanshell a partir da linha de comando pode ser encontrado aqui
Brad Parks
@hshib: Agora está no Github e o último commit é de 2013. Isso não é "mantido ativamente".
Martin Schröder
@ MartinSchröder, esse comentário foi em 2013 :-)
hshib
19

Você pode usar as páginas do Scrapbook do Eclipse.

No Eclipse, crie uma página do Scrapbook. Em seu projeto, página Novo-> Outro-> Livro de recortes.

No arquivo, digite algum texto, selecione-o e aperte ctrl-U, e pronto.

Para gerenciar suas importações, clique com o botão direito na página e selecione Definir Importações, onde você pode escolher importar um pacote ou uma única classe. Isso é persistente e é salvo com a página.

Matthew Farwell
fonte
3
Por mais útil que seja, uma página de scrapbook não é uma sessão persistente, portanto, não funciona muito bem como um REPL.
MHarris
19

Pergunta antiga, mas há uma resposta melhor agora (maio de 2013) - java-REPL! Está disponível no github e também disponível ao vivo no site java-repl para testes rápidos e pontuais.

Se você pegar o código do hub git e executar antpara gerar os artefatos, poderá torná-lo fácil de usar com um pequeno script como:

#!/bin/sh
java -jar /home/rdahlgren/scripts/javarepl-dev.build.jar

Desde que encontrei este projeto, provavelmente o uso 5 vezes ao dia. Aproveitar!

Ron Dahlgren
fonte
O link para a resposta online agora parece ser javarepl.com/term.html o link antigo mostra apenas erros de Java.
Tony
13

Parece que ninguém mencionou ainda que Java (6, 7) vem com um console REPL chamado jrunscript. É agnóstico de linguagem (portanto, pode ser usado com Jython, JRuby etc.). O padrão é JavaScript (Rhino), que também é empacotado por padrão e, como as outras linguagens, você pode acessar todos os pacotes / objetos disponíveis no classpath.

user268396
fonte
11

Como alternativa ao Groovy, experimente o Beanshell: http://www.beanshell.org/

É mais semelhante ao Java e permite que você use a sintaxe Java diretamente.

Tim Jansen
fonte
o beanshell é mantido mais?
rogerdpack,
1
BeanShell é mantido ativamente como beanshell 2 - code.google.com/p/beanshell2
hshib
@hshib: Não. O último commit no github é de 2013.
Martin Schröder
11

Jython é uma implementação python que permite inspecionar e interagir com objetos 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])
especioso
fonte
8

Clojure fornece um REPL que você pode usar.

Ande Turner
fonte
7

O console bacana permite que você faça isso. Na verdade, a intenção era tentar e testar o código groovy, mas como o groovy é um superconjunto do Java, ele também permite coisas simples do Java.

Acabei de inserir isso no console:

InetAddress.getAllByName('localhost')

e apertou CTRL-R, então retornou:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]
Ole
fonte
7

Scala também oferece um console interativo. Consegui usá-lo para obter um resultado para a expressão em sua pergunta qualificando totalmente o InetAddress, como em:

java.net.InetAddress.getAllByName("localhost")
joel.neely
fonte
6

Enquanto JRuby , BeanShell , REPL de Julian Fleischer estão lá, o REPL de Albert Latacz parece ser o mais recente e ativo.

Tentei com uma definição de classe simples, funciona bem.

$ 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);
sandeepkunkunuru
fonte
3

Para quem tem acesso ao Mathematica, o JLink permite acessar Java e script com o código do Mathematica:

Needs["JLink`"]
LoadJavaClass["java.net.InetAddress"]
InetAddress`getAllByName["localhost"]

Pressione Shift-Enter para avaliar e você obterá

{<<JavaObject[java.net.Inet4Address>>}

Então você pode usar a função Map do Mathematica para chamar toStringos objetos retornados:

#@toString[]& /@ %

para obter o resultado (ou usar a sintaxe menos obscura Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

Se você começar a levar isso a sério, leia o tutorial de Todd Gayley em http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html .

jfklein
fonte
2

Se você já conhece Groovy (o que presumo que conheça, já que mencionou o Console Groovy), basta usar groovysh ou groovyConsole, que estão incluídos na distribuição Groovy. Se você tiver jars personalizados que deseja importar, você pode escrever um arquivo em lote que inicia groovysh / groovyConsole com aqueles adicionados ao caminho de classe. Você também pode fazer isso

this.class.classLoader.rootLoader.addURL(new URL("file:///path to file"))

de dentro do shell para carregar outros jars.

Eu costumava usar Jython há vários anos para fazer exatamente o que você está pedindo. Como parte do meu script de construção, gerei um arquivo jython.bat e .py personalizado que incluía o classpath completo para o projeto em que estava trabalhando. Dessa forma, quando eu iniciei o Jython, ele teria todo o código disponível e traria o Spring para me permitir mexer nas coisas no sistema ativo. Você pode fazer a mesma coisa com Groovy, JRuby, BeanShell, etc.

Joey Gibson
fonte
Eu sei que poderia usar o shell groovy, mas Groovy não tem exatamente a mesma semântica do Java e não tem verificação de tipo. Portanto, é possível que eu pudesse obter erros de compilação ou comportamento de tempo de execução diferente com um pedaço de código Java que parecia funcionar no shell do Groovy.
Dónal
groovy também carregará todas as lib em ~ / .groovy / lib, você pode copiar coisas lá ou usar links simbólicos
Jason
1

A maioria dos IDE tem uma janela chamada algo como "modo imediato" que permitirá que você avalie o código Java em tempo real.

Krosenvold
fonte
O Eclipse tem uma visão de "exibição" próxima ao que desejo. O problema é que tem que estar no contexto da aplicação em execução. Tenho que executar um app, parar no breakpoint e só então digitar o que quero.
Yoni Roit
@YoniRoit IMHO Eu gosto mais de "display" + modo de depuração do que um REPL de linha de comando. Eu costumava usar REPL com Python há muito tempo, então usei os dois. Eu acho que é muito melhor escrever um Teste de Unidade e colocar um ponto de interrupção e brincar com o contexto desejado enquanto cola o código que funciona de volta no teste de unidade. Obter um contexto exato em um REPL simples é muito mais difícil do que dizer um Teste de Unidade.
Adam Gent,
1

Você pode dar uma olhada no BlueJ, que é um ambiente de desenvolvimento Java interativo destinado ao ensino de OOP, em vez de um IDE completo como Eclipse ou NetBeans. É divertido brincar de qualquer maneira.

Você pode vê-lo em ação no YouTube em uma série de tutoriais Java.

Trevor Tippins
fonte
isto é interessante. Bluej é como um op repl. Não é realmente útil para as coisas para as quais você atualmente usa um repl, mas você pode usá-lo para prototipar seu design oo da mesma forma que usaria um repl para prototipar um método.
Bill K
1

DrJava é um IDE educacional que inclui um painel REPL.

Também existe um plugin do Eclipse, mas não funcionou para mim. Acho que não é atualizado há algum tempo. Portanto, o que geralmente faço é manter uma janela do DrJava aberta para as perguntas "o que acontece se eu fizer isso".

EclipseShell pode ser bom também, mas ainda não usei.

johncip
fonte
1

Beanshell 2

Harishtella
fonte
Não mantido.
Martin Schröder
1

Existe um IDE simples chamado DrJava que possui um console Interactions. Funciona exatamente como eu esperava. Basta carregar um arquivo e começar a interagir com os objetos nele.

dansalmo
fonte
1

JPad é um scratchpad java com REPL integrado:

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>

Também é inteligente para despejar coleções, listas, mapas etc. e permite renderizá-los como uma tabela ou gráfico:

insira a descrição da imagem aqui

Ryan Hamilton
fonte
1

Java 9 está fornecendo o JShell.

jshell> println( "Print me!")
jshell> Print me!
Neha Gangwar
fonte
0

Jython, JIRB para JRuby, Groovy (groovyconsole et al) e Beanshell são opções viáveis.

Eu usei o InteractiveConsolepara Jython, ele realmente funcionou bem no aplicativo.

gpampara
fonte