2016-06-23 11 views
7

Java 9 sta introducendo REPL chiamato JShell all'interno della distribuzione JDK. C'è un modo per connettersi al JShell del JDK che sta eseguendo alcune applicazioni ed esegue comandi che fanno riferimento a quella app in esecuzione. Ad esempio, l'esecuzione di alcuni metodi forma il codice app, ispezionando oggetti, ecc.?Java 9 REPL per l'applicazione in esecuzione

+0

È possibile farlo in altri REPL? –

+2

No, questo non è l'obiettivo di JShell. L'obiettivo è quello di consentire di valutare le dichiarazioni java in modo veloce. JShell fornirà il contesto circostante per aiutarti a risparmiare tempo, non puoi dirgli di prendere un'applicazione come contesto circostante. –

+1

@bigdestroyer c'è un crash shell che fornisce un po 'di quello che ho citato http://www.crashub.org/ –

risposta

4

JShell non è il comando java standard, è un altro comando. Una volta aperto lo shell, "passa" in Read Eval Print Loop. Una volta che si digita un comando, esso viene letto e analizzato dalla shell, valutato e il risultato viene stampato.

È possibile definire variabili e aggiungere classi al classpath, ma non credo sia possibile avviare un'applicazione o un server da lì, almeno non in questa fase e non nella stessa JVM. Poiché puoi aggiungere classi, puoi istanziarle, ma non hai la possibilità di ispezionare le loro variabili. Comunque puoi vedere le variabili che istanziate nel tuo scope JShell (quali oggetti hai creato, puoi accedere e stampare solo i loro metodi e variabili pubblici).

Sembra che JShell abbia un'API, che apre la strada ad altre possibilità.

1

No, non facilmente con jshell.

ma mi permetta di riformulare la tua domanda in modo che non usiamo jshell ma qualunque strumento REPL java:

Esiste un modo per collegare qualche strumento REPL java contro un'applicazione Java in esecuzione ed eseguire i comandi riferimento che la corsa app. Ad esempio, l'esecuzione di alcuni metodi forma il codice app, ispezionando oggetti, ecc.?

https://github.com/lorenzoongithub/nudge4j

allora dovreste dare un'occhiata a nudge4j essa permette esattamente questo

l'unica avvertenza è per Java 8.

0

L'opzione alternativa che si potrebbe prendere in considerazione è qualcosa di simile BeanShell (anche se BeanShell è piuttosto vecchio e probabilmente deprecato). È possibile avviare una console BeanShell dall'interno dell'applicazione per consentire l'accesso agli oggetti e chiamare i metodi su di essi. Vedi l'esempio JConsole per alcune idee.