¿Existe algo como el modo REPL interactivo de Python, pero para Java?


92

¿Existe algo como el modo REPL interactivo de Python, pero para Java? ¿Para que pueda, por ejemplo, escribir InetAddress.getAllByName( localHostName )en una ventana y obtener resultados de inmediato, sin toda esta pesadilla () vacía estática pública?



3
Java introduciéndolo en JDK-9 : JEP 222: jshell: The Java Shell
No es un error

Respuestas:


64

editar Desde Java 9 hay JShell

La respuesta original sigue

También puede utilizar Groovy Console . Es una consola interactiva donde puedes hacer lo que quieras. Dado que Groovy también incluye clases de la plataforma central de Java, también podrá usar esas clases.

Se parece a esto:

Captura de pantalla de Groovy


La captura de pantalla ya no existe en imageshack.

Lo que es particularmente bueno de la maravillosa consola es que se importan muchos más paquetes de forma predeterminada (por ejemplo, java.util. *), Por lo que no es necesario escribir tantas declaraciones de importación
Dónal

2
Para aquellos que son demasiado vagos para instalar Groovy, hay una versión en línea de esta consola disponible aquí: groovyconsole.appspot.com . Algunas librerías JDK no están disponibles (por ejemplo, E / S y System.exit()) pero para la mayoría de los propósitos debería ser adecuado.
Dónal

Esto no acepta clases ¿es eso normal? class test{public static void test(){System.out.println('test')}}
Lima

52

Eclipse tiene una función para hacer esto, aunque no es un bucle. Se llama "Página de álbum de recortes". Supongo que se supone que la analogía es que tienes un álbum de recortes donde recolectas pequeños fragmentos de código.

De todos modos, para que funcione, abra un proyecto en Eclipse (su página de Scrapbook se asociará con un proyecto; a Eclipse le gusta cuando los proyectos poseen cosas).

Luego:

  1. En la ventana del navegador de proyectos, seleccione una carpeta que exista en algún lugar de su proyecto.
  2. Seleccione el menú Archivo -> Nuevo -> Otro, o presione Control-N.
  3. Seleccione Java -> Java Run / Debug -> Página de Scrapbook.
  4. Presiona "Siguiente", luego dale un nombre de archivo, luego presiona "Finalizar".

Ahora tienes una página de álbum de recortes. Escriba algún código, como tal vez este:

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

Luego, seleccione el texto con el mouse y presione Control-U o seleccione "Ejecutar" en el menú contextual. El código se ejecutará y la salida aparecerá en la consola.

También puede escribir una expresión, seleccionarla y seleccionar Mostrar en el menú contextual. Evaluará la expresión e imprimirá su tipo. Por ejemplo, si ejecuta Display on 1 + 2se imprimirá (int) 3.


1
Gracias por eso. Beanshell estaba agotando el tiempo de espera para mí, pero esto funciona perfectamente.
Bayard Randel

3
He estado usando Eclipse durante tanto tiempo pero no sabía sobre esto, ¡gracias!
Tobold

28

BeanShell es un intérprete de código fuente Java pequeño, gratuito e integrable con características de lenguaje de secuencias de comandos de objetos, escrito en Java. BeanShell ejecuta dinámicamente la sintaxis estándar de Java y la amplía con las conveniencias de scripts comunes, como tipos sueltos, comandos y cierres de métodos como los de Perl y JavaScript. Puede utilizar BeanShell de forma interactiva para la experimentación y la depuración de Java, así como para ampliar sus aplicaciones de nuevas formas. Scripting Java se presta a una amplia variedad de aplicaciones que incluyen creación rápida de prototipos, extensión de scripting de usuario, motores de reglas, configuración, pruebas, implementación dinámica, sistemas integrados e incluso educación Java.

http://www.beanshell.org/

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


También hay shells interactivos Jython y JRuby para sintaxis menos detalladas.
bakkal

1
BeanShell se mantiene activamente como beanshell 2 - code.google.com/p/beanshell2
hshib

Puede encontrar un ejemplo simple de ejecución de beanshell desde la línea de comandos aquí
Brad Parks

@hshib: Ahora está en Github y la última confirmación es de 2013. Eso no se "mantiene activamente".
Martin Schröder

@ MartinSchröder, ese comentario FUE en 2013 :-)
hshib

19

Puede utilizar las páginas de Eclipse Scrapbook.

En Eclipse cree una página de Scrapbook. En su proyecto, Nueva-> Otro-> Página de Scrapbook.

En el archivo, ingrese algún texto, selecciónelo y presione ctrl-U, y listo.

Para administrar sus importaciones, haga clic derecho en la página y seleccione Establecer importaciones, donde puede elegir importar un paquete o una sola clase. Esto es persistente y se guarda con la página.


3
Por útil que sea, una página de un álbum de recortes no es una sesión persistente, por lo que no funciona muy bien como REPL.
MHarris

19

Antigua pregunta, pero ahora hay una mejor respuesta (mayo de 2013): java-REPL! Está disponible en github y también en vivo en el sitio web de java-repl para realizar pruebas rápidas y únicas .

Si toma el código de git hub y lo ejecuta antpara generar los artefactos, puede facilitar su uso con un pequeño script como:

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

Desde que encontré este proyecto, probablemente lo use 5 veces al día. ¡Disfrutar!


El enlace para la respuesta en línea ahora parece ser javarepl.com/term.html, el enlace anterior solo muestra errores de Java.
Tony

13

Parece que nadie mencionó todavía que Java (6, 7) incluye una consola REPL llamada jrunscript. Es independiente del lenguaje (por lo que se puede usar con Jython, JRuby, etc.). Tiene como valor predeterminado JavaScript (Rhino), que también está incluido de forma predeterminada, y al igual que los otros idiomas, puede acceder a todos los paquetes / objetos disponibles en la ruta de clases.




11

Jython es una implementación de Python que le permite inspeccionar e interactuar con 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

La maravillosa consola te permite hacer eso. En realidad, estaba destinado a probar y probar código maravilloso, pero dado que groovy es un superconjunto de Java, también permite cosas simples de Java.

Acabo de ingresar esto en la consola:

InetAddress.getAllByName('localhost')

y presione CTRL-R, luego regresó:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]

7

Scala también ofrece una consola interactiva. Pude usarlo para obtener un resultado para la expresión en su pregunta al calificar completamente InetAddress, como en:

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

6

Mientras que JRuby , BeanShell , REPL de Julian Fleischer están ahí, el REPL de Albert Latacz parece ser el último y activo.

Lo intenté con una definición de clase simple, funciona 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

Para las personas con acceso a Mathematica, JLink les permite acceder a Java y script con código de Mathematica:

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

Presiona Shift-Enter para evaluar y obtienes

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

Luego puede usar la función Map de Mathematica para llamar toStringa los objetos devueltos:

#@toString[]& /@ %

para obtener el resultado (o para usar la sintaxis menos oscura Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

Si empieza a tomarse en serio esto, querrá leer el tutorial de Todd Gayley en http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html .


2

Si ya conoces Groovy (lo que supongo que sí, ya que mencionaste la Consola Groovy), usa groovysh o groovyConsole, que se incluyen en la distribución Groovy. Si tiene jarras personalizadas que desea importar, puede escribir un archivo por lotes que inicie groovysh / groovyConsole con los agregados a la ruta de clases. También puedes hacer esto

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

desde dentro de la cáscara para cargar otros frascos.

Solía ​​usar Jython hace varios años para hacer exactamente lo que me pide. Como parte de mi script de compilación, generé un archivo jython.bat y .py personalizado que incluía la ruta de clase completa para el proyecto en el que estaba trabajando. De esa manera, cuando inicié Jython, tendría todo el código disponible y aparecería Spring para permitirme manipular cosas en el sistema en vivo. Puedes hacer lo mismo con Groovy, JRuby, BeanShell, etc.


Sé que podría usar el shell maravilloso, pero Groovy no tiene exactamente la misma semántica que Java y no tiene verificación de tipos. Entonces, es posible que pueda obtener errores de compilación o un comportamiento de tiempo de ejecución diferente con un fragmento de código Java que parecía funcionar en el shell Groovy.
Dónal

groovy también cargará todas las bibliotecas en ~ / .groovy / lib, puede copiar cosas allí o usar enlaces simbólicos
Jason



1

La mayoría de los IDE tienen una ventana llamada algo así como "modo inmediato" que le permitirá evaluar el código Java sobre la marcha.


Eclipse tiene una vista de "pantalla" que se acerca a lo que quiero. El problema es que tiene que estar en el contexto de la aplicación en ejecución. Tengo que ejecutar una aplicación, detenerme en el punto de interrupción y solo entonces puedo escribir lo que quiero.
Yoni Roit

@YoniRoit En mi humilde opinión, me gusta "mostrar" + el modo de depuración mejor que un REPL de línea de comando. Solía ​​usar REPL con Python hace mucho tiempo, así que he hecho ambas cosas. Creo que es mucho mejor escribir una prueba unitaria y colocar un punto de interrupción y jugar con el contexto deseado mientras se pega cualquier código que funcione en la prueba unitaria. Obtener un contexto exacto en un REPL simple es mucho más difícil que decir una prueba unitaria.
Adam Gent

1

Podrías echar un vistazo a BlueJ que es un entorno de desarrollo interactivo de Java destinado a la enseñanza de OOP en lugar de un IDE completo como Eclipse o NetBeans. De todos modos, es divertido jugar con él.

Puede verlo en acción en YouTube en una serie de tutoriales de Java.


esto es interesante. Bluej es como una réplica de operaciones. No es realmente útil para las cosas para las que usa actualmente una respuesta, pero puede usarla para crear un prototipo de su diseño de oo como usaría una respuesta para crear un prototipo de un método.
Bill K

1

DrJava es un IDE educativo que incluye un panel REPL.

También hay un complemento de Eclipse, pero no me ha funcionado. Creo que no se ha actualizado en un tiempo. Entonces, lo que generalmente hago es mantener una ventana de DrJava abierta para las preguntas "¿Qué sucede si hago esto?".

EclipseShell también puede ser bueno, pero aún no lo he usado.



1

Existe un IDE simple llamado DrJava que tiene una consola de interacciones. Funciona exactamente como esperaba. Simplemente cargue un archivo y comience a interactuar con los objetos que contiene.




1

JPad es un bloc de notas de Java con un REPL incorporado:

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>

También es inteligente para descargar colecciones, listas, mapas, etc. y permite representarlos como una tabla o gráfico:

ingrese la descripción de la imagen aquí


1

Java 9 proporciona JShell.

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

0

Jython, JIRB para JRuby, Groovy (groovyconsole et al) y Beanshell son todas opciones viables.

He usado InteractiveConsolepara Jython, realmente funcionó muy bien en la aplicación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.