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
.classni.jar. - Clases complejas (anidadas, con static initializers elaborados) pueden no encajar bien.
- No es el entorno para ejecutar aplicaciones con
main(para eso usajavao 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
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.