JShell: el REPL de Java

Básico
Java
Java
Actualizado: 18/04/2026

Qué es JShell

JShell es la Read-Eval-Print Loop (REPL) oficial de Java, incluida en el JDK desde Java 9. Permite escribir expresiones, declaraciones, métodos y clases línea a línea y ver el resultado inmediatamente, sin necesidad de un proyecto, main ni compilación manual.

Es una herramienta tremendamente útil para:

  • Aprender sintaxis nueva.
  • Probar snippets rápidos.
  • Explorar APIs.
  • Reproducir bugs de forma minimalista.
  • Enseñar el lenguaje sin ceremonia.

Arrancar JShell

En cualquier sistema con el JDK instalado:

$ jshell
| Welcome to JShell -- Version 26
| For an introduction type: /help intro

jshell>

Ya puedes escribir código Java directamente:

jshell> 2 + 3
$1 ==> 5

jshell> int x = 10
x ==> 10

jshell> x * x
$3 ==> 100

Las expresiones sin nombre se guardan en variables automáticas $1, $2, $3... que puedes reutilizar.

Declaraciones

Puedes declarar variables, métodos y clases sobre la marcha:

jshell> String saludar(String nombre) {
 ...> return "Hola, " + nombre;
 ...> }
| created method saludar(String)

jshell> saludar("Ana")
$5 ==> "Hola, Ana"

jshell> class Persona {
 ...> String nombre;
 ...> int edad;
 ...> Persona(String n, int e) { nombre = n; edad = e; }
 ...> public String toString() { return nombre + " (" + edad + ")"; }
 ...> }
| created class Persona

jshell> Persona p = new Persona("Ana", 30)
p ==> Ana (30)

No necesitas public class ni main. JShell permite definiciones sueltas.

Comandos internos

Comandos que empiezan por / controlan el entorno. Los más útiles:

| Comando | Función | |---------|---------| | /help | Lista todos los comandos | | /vars | Muestra variables declaradas | | /methods | Muestra métodos declarados | | /types | Muestra clases/enums/interfaces declarados | | /imports | Muestra imports activos | | /list | Lista el historial de snippets | | /reset | Borra todo y reinicia la sesión | | /drop <id> | Elimina un snippet concreto | | /save <file> | Guarda la sesión a un archivo | | /open <file> | Carga snippets desde archivo | | /edit <id> | Abre un editor externo para modificar un snippet | | /exit | Sale |

Ejemplo:

jshell> /vars
| int x = 10
| Persona p = Ana (30)

jshell> /methods
| String saludar(String)

jshell> /save sesion.jsh
jshell> /exit

Imports implícitos

JShell tiene preimportados paquetes comunes: java.util, java.io, java.net, java.math, java.time, java.util.concurrent, etc. No necesitas importarlos.

Para imports adicionales:

jshell> import java.nio.file.*
jshell> Files.readString(Path.of("archivo.txt"))

Tipos con var

var funciona especialmente bien en JShell (no hace falta declarar tipos explícitos):

jshell> var lista = List.of(1, 2, 3, 4, 5)
lista ==> [1, 2, 3, 4, 5]

jshell> var suma = lista.stream().mapToInt(Integer::intValue).sum()
suma ==> 15

Modificar declaraciones

JShell permite redeclarar: si vuelves a escribir una variable o método con el mismo nombre, sustituye la anterior:

jshell> int x = 10
x ==> 10

jshell> int x = 99
x ==> 99

/edit <id> abre un editor para modificar un snippet complejo.

Cargar un archivo

jshell> /open misCodes.jsh

misCodes.jsh puede contener clases, métodos y líneas de ejemplo. Muy útil para compartir snippets reproducibles.

Alternativamente, desde terminal:

$ jshell script.jsh

Ejecuta el script y muestra los resultados.

Integración con módulos y classpath

Para usar bibliotecas externas:

$ jshell --class-path=libreria.jar

O dentro de JShell:

jshell> /env --class-path libreria.jar

Permite experimentar con cualquier API que tengas en tu disco.

Casos de uso comunes

Probar una API desconocida:

jshell> var ahora = java.time.ZonedDateTime.now()
jshell> ahora.withZoneSameInstant(java.time.ZoneId.of("America/New_York"))

Sanity check de una fórmula:

jshell> double r = 5.0
jshell> double area = Math.PI * r * r
area ==> 78.53981633974483

Explorar métodos:

jshell> "hola".[tab]
// Autocompletado muestra todos los métodos de String

El tab dispara autocompletado; muy cómodo para explorar clases.

Reproducir un bug mínimo:

jshell> List.of(1, 2, null)
| Exception java.lang.NullPointerException
| at Collections$ImmutableCollections.listFromArray (Collections.java:...)

Reproducible en segundos, útil para reportar en GitHub o Stack Overflow.

Limitaciones

  • JShell no reemplaza un proyecto real: no genera .class ni .jar.
  • Clases complejas (anidadas, con static initializers elaborados) pueden no encajar bien.
  • No es el entorno para ejecutar aplicaciones con main (para eso usa java o el IDE).

Resumen

JShell es una herramienta ligera y utiles para:

  • Aprender Java con feedback inmediato.
  • Prototipar lógica.
  • Probar expresiones y APIs.
  • Enseñar el lenguaje sin complicaciones.

En 2026, saber usar JShell es parte del estándar básico de un desarrollador Java. Es gratis, viene con el JDK y reduce drásticamente el coste de experimentar.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Java es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Java

Explora más contenido relacionado con Java y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Arrancar JShell desde el terminal con jshell. Evaluar expresiones, declarar variables y métodos al vuelo. Importar clases adicionales. Usar comandos internos: /vars, /methods, /imports, /reset, /save, /open. Cargar snippets desde archivo. Aprovechar JShell para prototipar y enseñar.