Existe-t-il quelque chose comme le mode REPL interactif de python, mais pour Java?


92

Existe-t-il quelque chose comme le mode REPL interactif de python, mais pour Java? Pour que je puisse, par exemple, taper InetAddress.getAllByName( localHostName )dans une fenêtre, et obtenir immédiatement des résultats, sans tout ce cauchemar public statique vide ()?



3
Java l'introduisant dans JDK-9 : JEP 222: jshell: The Java Shell
Not a bug

Réponses:


64

edit Depuis Java 9, il y a JShell

La réponse originale suit

Vous pouvez également utiliser Groovy Console . C'est une console interactive où vous pouvez faire ce que vous voulez. Étant donné que Groovy comprend également des classes de la plate-forme Java principale, vous pourrez également utiliser ces classes.

Cela ressemble à ceci:

Capture d'écran de Groovy


La capture d'écran n'existe plus sur imageshack.

Ce qui est particulièrement agréable à propos de la console groovy, c'est que beaucoup plus de packages sont importés par défaut (par exemple, java.util. *), Vous n'avez donc pas besoin d'écrire autant de déclarations d'importation
Dónal

2
Pour ceux qui sont trop paresseux pour installer Groovy, il existe une version en ligne de cette console disponible ici: groovyconsole.appspot.com . Certaines bibliothèques JDK ne sont pas disponibles (par exemple les E / S et System.exit()), mais pour la plupart des cas, elles devraient être adéquates.
Dónal

Cela n'accepte pas les classes est-ce normal? class test{public static void test(){System.out.println('test')}}
Lime

52

Eclipse a une fonctionnalité pour faire cela, bien que ce ne soit pas une boucle. C'est ce qu'on appelle une "page Scrapbook". Je suppose que l'analogie est censée être que vous avez un album dans lequel vous collectez de petits extraits de code.

Quoi qu'il en soit, pour le faire fonctionner, ouvrez un projet dans Eclipse (votre page Scrapbook va être associée à un projet - Eclipse aime quand les projets possèdent des choses).

Ensuite:

  1. Dans la fenêtre du navigateur de projet, sélectionnez un dossier qui existe quelque part dans votre projet.
  2. Sélectionnez le menu Fichier -> Nouveau -> Autre, ou appuyez sur Control-N.
  3. Sélectionnez Java -> Java Run / Debug -> Scrapbook Page.
  4. Appuyez sur "Suivant", puis donnez-lui un nom de fichier, puis appuyez sur "Terminer".

Vous avez maintenant une page d'album. Tapez du code, comme peut-être ceci:

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

Ensuite, sélectionnez le texte avec la souris et appuyez sur Ctrl-U ou sélectionnez "Exécuter" dans le menu contextuel. Le code s'exécutera et la sortie apparaîtra sur la console.

Vous pouvez également saisir une expression, la sélectionner et sélectionner Afficher dans le menu contextuel. Il évaluera l'expression et affichera son type. Par exemple, exécuter Display on 1 + 2imprimera (int) 3.


1
Merci pour ça. Beanshell était en retard sur les éclaboussures pour moi, mais cela fonctionne parfaitement.
Bayard Randel

3
J'utilise Eclipse depuis si longtemps mais je ne savais pas à ce sujet, merci!
Tobold

28

BeanShell est un petit interpréteur de source Java gratuit et intégrable avec des fonctionnalités de langage de script d'objet, écrit en Java. BeanShell exécute dynamiquement la syntaxe Java standard et l'étend avec des fonctionnalités de script courantes telles que des types lâches, des commandes et des fermetures de méthodes comme celles de Perl et JavaScript. Vous pouvez utiliser BeanShell de manière interactive pour l'expérimentation et le débogage Java, ainsi que pour étendre vos applications de nouvelles manières. Scripting Java se prête à une grande variété d'applications, y compris le prototypage rapide, l'extension de script utilisateur, les moteurs de règles, la configuration, les tests, le déploiement dynamique, les systèmes embarqués et même l'éducation Java.

http://www.beanshell.org/

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


Il existe également des shells interactifs Jython et JRuby pour des syntaxes moins verbeuses.
bakkal le

1
BeanShell est activement maintenu en tant que beanshell 2 - code.google.com/p/beanshell2
hshib

Un exemple simple d'exécution de beanshell à partir de la ligne de commande peut être trouvé ici
Brad Parks

@hshib: Il est maintenant sur Github et le dernier commit date de 2013. Ce n'est pas "activement maintenu".
Martin Schröder

@ MartinSchröder, ce commentaire était en 2013 :-)
hshib

19

Vous pouvez utiliser les pages Scrapbook Eclipse.

Dans Eclipse, créez une page Scrapbook. Dans votre projet, page Nouveau-> Autre-> Scrapbook.

Dans le fichier, entrez du texte, sélectionnez-le et appuyez sur ctrl-U, et c'est parti.

Pour gérer vos importations, faites un clic droit dans la page et sélectionnez Définir les importations, où vous pouvez choisir d'importer un package ou une seule classe. Ceci est persistant et est enregistré avec la page.


3
Aussi utile que cela puisse être, une page d'album n'est pas une session persistante, donc ne fonctionne pas vraiment très bien en tant que REPL.
MHarris

19

Ancienne question, mais il y a une meilleure réponse maintenant (mai 2013) - java-REPL! Il est disponible sur github et également disponible en direct sur le site Web java-repl pour des tests ponctuels rapides.

Si vous récupérez le code git hub et exécutez antpour générer les artefacts, vous pouvez le rendre facile à utiliser avec un petit script comme:

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

Depuis que j'ai trouvé ce projet, je l'utilise probablement 5 fois par jour. Prendre plaisir!


Le lien pour la réplique en ligne semble maintenant être javarepl.com/term.html, l'ancien lien ne montre que les erreurs Java.
Tony

13

Il semble que personne n'ait encore mentionné que Java (6, 7) propose une console REPL appelée jrunscript. Il est indépendant du langage (peut donc être utilisé avec Jython, JRuby, etc.). Il utilise par défaut JavaScript (Rhino) qui est également fourni par défaut, et comme les autres langages, vous pouvez accéder à tous les packages / objets disponibles sur le chemin de classe.




11

Jython est une implémentation python qui vous permet d'inspecter et d'interagir avec des objets 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 console groovy vous permet de faire cela. Il était en fait destiné à essayer de tester du code groovy, mais comme groovy est un sur-ensemble de Java, il permet également des éléments Java simples.

Je viens de saisir ceci dans la console:

InetAddress.getAllByName('localhost')

et appuyez sur CTRL-R, puis il est retourné:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]

7

Scala propose également une console interactive. J'ai pu l'utiliser pour obtenir un résultat pour l'expression dans votre question en qualifiant complètement InetAddress, comme dans:

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

6

Alors que JRuby , BeanShell , la REPL de Julian Fleischer sont là, la REPL d'Albert Latacz semble être la dernière et active.

Je l'ai essayé avec une définition de classe simple, fonctionne très bien.

$ 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

Pour les personnes ayant accès à Mathematica, JLink vous permet d'accéder à Java et au script avec du code Mathematica:

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

Appuyez sur Maj-Entrée pour évaluer, et vous obtenez

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

Ensuite, vous pouvez utiliser la fonction Map de Mathematica pour appeler toStringles objets renvoyés:

#@toString[]& /@ %

pour obtenir le résultat (ou pour utiliser la syntaxe moins obscure, Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

Si vous commencez à devenir sérieux avec cela, vous voudrez lire le tutoriel de Todd Gayley à http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html .


2

Si vous connaissez déjà Groovy (ce que je suppose que vous faites, puisque vous avez mentionné la console Groovy), utilisez simplement groovysh ou groovyConsole, qui sont inclus dans la distribution Groovy. Si vous avez des fichiers JAR personnalisés que vous souhaitez importer, vous pouvez soit écrire un fichier batch qui démarre groovysh / groovyConsole avec ceux ajoutés au classpath. Vous pouvez également le faire

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

depuis l'intérieur du shell pour charger d'autres bocaux.

J'utilisais Jython il y a plusieurs années pour faire exactement ce que vous demandez. Dans le cadre de mon script de construction, j'ai généré un fichier jython.bat et .py personnalisé qui incluait le chemin de classe complet pour le projet sur lequel je travaillais. De cette façon, quand j'ai commencé Jython, tout le code serait disponible et cela ferait apparaître Spring pour me permettre de manipuler les choses dans le système live. Vous pouvez faire la même chose avec Groovy, JRuby, BeanShell, etc.


Je sais que je pourrais utiliser le shell groovy, mais Groovy n'a pas exactement la même sémantique que Java et n'a pas de vérification de type. Il est donc possible que je puisse obtenir des erreurs de compilation, ou un comportement d'exécution différent avec un morceau de code Java qui semblait fonctionner dans le shell Groovy.
Dónal le

groovy chargera également toutes les bibliothèques dans ~ / .groovy / lib, vous pouvez soit y copier des éléments, soit utiliser des liens symboliques
Jason



1

La plupart des IDE ont une fenêtre appelée quelque chose comme "mode immédiat" qui vous permettra d'évaluer le code java à la volée.


Eclipse a une vue "affichage" qui est proche de ce que je veux. Le problème est que cela doit être dans le contexte de l'exécution de l'application. Je dois exécuter une application, m'arrêter au point d'arrêt et alors seulement je peux taper ce que je veux.
Yoni Roit

@YoniRoit IMHO J'aime mieux le mode "affichage" + débogage qu'une ligne de commande REPL. J'utilisais REPL w / Python il y a longtemps, j'ai donc fait les deux. Je pense qu'il est de loin préférable d'écrire un test unitaire et de placer un point d'arrêt et de jouer avec le contexte souhaité tout en collant le code qui fonctionne dans le test unitaire. Obtenir un contexte exact dans une REPL simple est beaucoup plus difficile que de dire un test unitaire.
Adam Gent

1

Vous pouvez jeter un œil à BlueJ qui est un environnement de développement Java interactif destiné à enseigner la POO plutôt que l'EDI complet comme Eclipse ou NetBeans. C'est plutôt amusant de jouer avec de toute façon.

Vous pouvez le voir en action sur YouTube dans une série de didacticiels Java.


c'est intéressant. Bluej est comme un op repl. Pas vraiment utile pour les choses pour lesquelles vous utilisez actuellement un repl, mais vous pouvez l'utiliser pour prototyper votre conception oo comme vous utiliseriez un repl pour prototyper une méthode.
Bill K

1

DrJava est un IDE éducatif qui comprend un volet REPL.

Il existe également un plugin Eclipse, mais cela n'a pas fonctionné pour moi. Je pense qu'il n'a tout simplement pas été mis à jour depuis un moment. Donc, ce que je fais généralement est de garder une fenêtre DrJava ouverte pour les questions «que se passe-t-il si je fais cela».

EclipseShell est peut-être bien aussi, mais je ne l'ai pas encore utilisé.



1

Il existe un IDE simple appelé DrJava qui possède une console Interactions. Cela fonctionne exactement comme je m'y attendais. Chargez simplement un fichier et commencez à interagir avec les objets qu'il contient.




1

JPad est un bloc-notes java avec un REPL intégré:

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>

Il est également intelligent pour vider les collections, les listes, les cartes, etc. et permet de les rendre sous forme de tableau ou de graphique:

entrez la description de l'image ici


1

Java 9 fournit le JShell.

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

0

Jython, JIRB pour JRuby, Groovy (groovyconsole et al) et Beanshell sont toutes des options viables.

J'ai utilisé le InteractiveConsolepour Jython, cela fonctionnait vraiment bien dans l'application.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.