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?



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


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.


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


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.


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!


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.




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



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]

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

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

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 .


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.


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.


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.


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.



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.




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


1

Java 9 está fornecendo o JShell.

jshell> println( "Print me!")
jshell> Print me!

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.