C'è qualcosa come la modalità REPL interattiva di Python, ma per Java?


92

C'è qualcosa come la modalità REPL interattiva di Python, ma per Java? In modo che io possa, ad esempio, digitare InetAddress.getAllByName( localHostName )in una finestra e ottenere immediatamente risultati, senza tutta questa cosa pubblica statica void nightmare ()?



Risposte:


64

modifica A partire da Java 9 c'è JShell

Segue la risposta originale

Puoi anche usare Groovy Console . È una console interattiva dove puoi fare ciò che vuoi. Poiché Groovy include anche classi dalla piattaforma Java principale, sarai in grado di utilizzare anche quelle classi.

Assomiglia a questo:

Screenshot di Groovy


Lo screenshot non esiste più su imageshack.

La cosa particolarmente bella della console groovy è che molti più pacchetti vengono importati per impostazione predefinita (ad esempio java.util. *), Quindi non è necessario scrivere così tante istruzioni di importazione
Dónal

2
Per coloro che sono troppo pigri per installare Groovy, c'è una versione online di questa console disponibile qui: groovyconsole.appspot.com . Alcune librerie JDK non sono disponibili (ad esempio I / O e System.exit()) ma per la maggior parte degli scopi dovrebbero essere adeguate.
Dónal

Questo non accetta lezioni è normale? class test{public static void test(){System.out.println('test')}}
Lime

52

Eclipse ha una funzione per farlo, sebbene non sia un ciclo. Si chiama "Scrapbook Page". Presumo che l'analogia dovrebbe essere che hai un album in cui raccogli piccoli frammenti di codice.

Ad ogni modo, per farlo funzionare, apri un progetto in Eclipse (la tua pagina Scrapbook sarà associata a un progetto - a Eclipse piace quando i progetti possiedono cose).

Poi:

  1. Nella finestra di navigazione del progetto, seleziona una cartella che esiste da qualche parte nel tuo progetto.
  2. Seleziona il menu File -> Nuovo -> Altro o premi Control-N.
  3. Seleziona Java -> Java Run / Debug -> Scrapbook Page.
  4. Premi "Avanti", quindi dagli un nome di file, quindi premi "Fine".

Ora hai una pagina di album. Digita un codice, come forse questo:

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

Quindi seleziona il testo con il mouse e premi Control-U o seleziona "Esegui" dal menu contestuale. Il codice verrà eseguito e l'output verrà visualizzato sulla console.

È inoltre possibile digitare un'espressione, selezionarla e selezionare Visualizza dal menu di scelta rapida. Valuterà l'espressione e ne stamperà il tipo. Ad esempio, 1 + 2verrà stampato Display acceso (int) 3.


1
Grazie per quello. Beanshell era scaduto per me, ma funziona perfettamente.
Bayard Randel

3
Uso Eclipse da così tanto tempo ma non lo sapevo, grazie!
Tobold

28

BeanShell è un piccolo interprete di sorgenti Java integrabile gratuito con funzionalità del linguaggio di scripting degli oggetti, scritto in Java. BeanShell esegue dinamicamente la sintassi Java standard e la estende con le comodità di scripting comuni come tipi sciolti, comandi e chiusure di metodi come quelli in Perl e JavaScript. È possibile utilizzare BeanShell in modo interattivo per la sperimentazione e il debug di Java, nonché per estendere le applicazioni in nuovi modi. Scripting Java si presta a un'ampia varietà di applicazioni tra cui prototipazione rapida, estensione di scripting utente, motori di regole, configurazione, test, distribuzione dinamica, sistemi incorporati e persino istruzione Java.

http://www.beanshell.org/

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


Esistono anche shell interattive Jython e JRuby per sintassi meno prolisse.
bakkal

1
BeanShell viene mantenuto attivamente come beanshell 2 - code.google.com/p/beanshell2
hshib

Un semplice esempio di esecuzione di beanshell dalla riga di comando può essere trovato qui
Brad Parks,

@hshib: E 'ora al Github e l'ultimo commit è dal 2013. Quel non "attivamente mantenute".
Martin Schröder

@ MartinSchröder, quel commento ERA nel 2013 :-)
hshib

19

Puoi utilizzare le pagine di Eclipse Scrapbook.

In Eclipse creare una pagina Scrapbook. Nel tuo progetto, Nuovo-> Altro-> pagina Scrapbook.

Nel file, inserisci del testo, selezionalo e premi ctrl-U, e il gioco è fatto.

Per gestire le tue importazioni, fai clic con il tasto destro nella pagina e seleziona Imposta importazioni, dove puoi scegliere di importare un pacchetto o una singola classe. Questo è persistente e viene salvato con la pagina.


3
Per quanto utile possa essere, una pagina di album non è una sessione persistente, quindi non funziona molto bene come REPL.
MHarris

19

Vecchia domanda, ma ora c'è una risposta migliore (maggio 2013): java-REPL! È disponibile su GitHub e anche disponibile dal vivo sul sito Web Java-Rep per rapidi test una tantum.

Se prendi il codice dell'hub git ed esegui antper generare gli artefatti, puoi renderlo facile da usare con un piccolo script come:

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

Da quando ho trovato questo progetto, probabilmente lo uso 5 volte al giorno. Godere!


Il collegamento per la sostituzione in linea ora sembra essere javarepl.com/term.html il vecchio collegamento mostra solo errori Java.
Tony

13

Sembra che nessuno abbia ancora menzionato che Java (6, 7) fornisce una console REPL chiamata jrunscript. È indipendente dal linguaggio (quindi può essere utilizzato con Jython, JRuby ecc.). Il valore predefinito è JavaScript (Rhino), anch'esso fornito in bundle per impostazione predefinita e, come le altre lingue, è possibile accedere a tutti i pacchetti / oggetti disponibili sul classpath.




11

Jython è un'implementazione di Python che consente di ispezionare e interagire con oggetti 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

La fantastica console ti permette di farlo. In realtà era pensato per provare a testare codice groovy, ma poiché groovy è un superset di Java, consente anche semplici cose Java.

Ho appena inserito questo nella console:

InetAddress.getAllByName('localhost')

e premi CTRL-R, quindi è tornato:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]

7

Scala offre anche una console interattiva. Sono stato in grado di usarlo per ottenere un risultato per l'espressione nella tua domanda qualificando completamente InetAddress, come in:

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

6

Mentre JRuby , BeanShell , REPL di Julian Fleischer sono presenti REPL di Albert Latacz sembra essere l'ultimo e attivo.

Ho provato con una semplice definizione di classe, funziona bene.

$ 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

Per le persone con accesso a Mathematica, JLink consente di accedere a Java e script con il codice Mathematica:

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

Premi Shift-Enter per valutare e ottieni

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

Quindi puoi usare la funzione Map di Mathematica per chiamare toStringgli oggetti restituiti:

#@toString[]& /@ %

per ottenere il risultato (o per usare la sintassi meno oscura Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

Se inizi a fare sul serio con questo, ti consigliamo di leggere il tutorial di Todd Gayley su http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html .


2

Se conosci già Groovy (cosa che presumo tu lo sappia, dato che hai menzionato la Groovy Console), allora usa groovysh o groovyConsole, che sono inclusi nella distribuzione Groovy. Se si dispone di jar personalizzati che si desidera importare, è possibile scrivere un file batch che avvia groovysh / groovyConsole con quelli aggiunti al classpath. Puoi anche farlo

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

dall'interno del guscio per caricare altri barattoli.

Ho usato Jython diversi anni fa per fare proprio quello che mi chiedi. Come parte del mio script di compilazione, ho generato un file jython.bat e .py personalizzato che includeva il percorso di classe completo per il progetto su cui stavo lavorando. In questo modo, quando ho avviato Jython, avrebbe avuto tutto il codice disponibile e sarebbe stato visualizzato Spring per consentirmi di modificare le cose nel sistema live. Puoi fare la stessa cosa con Groovy, JRuby, BeanShell, ecc.


So che potrei usare la shell groovy, ma Groovy non ha esattamente la stessa semantica di Java e non ha il controllo del tipo. Quindi è possibile che io possa ottenere errori di compilazione o un diverso comportamento di runtime con un pezzo di codice Java che sembrava funzionare nella shell Groovy.
Dónal

groovy caricherà anche tutte le librerie in ~ / .groovy / lib, puoi copiare delle cose lì o usare collegamenti simbolici
Jason



1

La maggior parte degli IDE ha una finestra chiamata qualcosa come "modalità immediata" che ti permetterà di valutare il codice java al volo.


Eclipse ha una vista "display" che è vicina a quello che voglio. Il problema è che deve essere nel contesto dell'applicazione in esecuzione. Devo eseguire un'app, fermarmi al punto di interruzione e solo allora posso digitare quello che voglio.
Yoni Roit

@YoniRoit IMHO mi piace "display" + modalità di debug meglio di una REPL da riga di comando. Ho usato REPL con Python molto tempo fa, quindi ho fatto entrambe le cose. Penso che sia molto meglio scrivere un test unitario e inserire un punto di interruzione e giocare con il contesto desiderato mentre si incolla tutto il codice che funziona nello unit test. Ottenere un contesto esatto in un semplice REPL è molto più difficile che dire uno Unit Test.
Adam Gent

1

Potresti dare un'occhiata a BlueJ, un ambiente di sviluppo Java interattivo pensato per insegnare OOP piuttosto che come IDE completo come Eclipse o NetBeans. È comunque divertente giocare con lui.

Puoi vederlo in azione su YouTube in una serie di tutorial Java.


questo è interessante. Bluej è come un sostituto operativo. Non è molto utile per le cose per cui attualmente usi un repl ma potresti usarlo per prototipare il tuo progetto oo come useresti un repl per prototipare un metodo.
Bill K

1

DrJava è un IDE educativo che include un riquadro REPL.

Esiste anche un plugin Eclipse, ma non ha funzionato per me. Penso che non sia stato aggiornato da un po '. Quindi quello che faccio generalmente è tenere aperta una finestra di DrJava per le domande "cosa succede se lo faccio".

Anche EclipseShell potrebbe essere buono, ma non l'ho ancora usato.



1

C'è un semplice IDE chiamato DrJava che ha una console Interazioni. Funziona esattamente come mi sarei aspettato. Basta caricare un file e iniziare a interagire con gli oggetti in esso contenuti.




1

JPad è uno scratchpad java con REPL integrato:

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>

È anche intelligente per scaricare raccolte, elenchi, mappe ecc. E consente di renderli come una tabella o un grafico:

inserisci qui la descrizione dell'immagine


1

Java 9 fornisce JShell.

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

0

Jython, JIRB per JRuby, Groovy (groovyconsole et al) e Beanshell sono tutte opzioni praticabili.

Ho usato InteractiveConsoleper Jython, ha funzionato davvero bene nell'app.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.