2017-09-14 4 views
7

Es scheint, dass JShell Objekt erstellt in einem anderen JShell hat keinen Zugriff auf JShell Bereich der Eltern. Zum Beispiel:Zugriff auf "Parent-Bereich" in JShell

jshell> int x = 1; 
x ==> 1 

jshell> x 
x ==> 1 

jshell> jdk.jshell.JShell js = jdk.jshell.JShell.create(); 
js ==> [email protected] 

jshell> js.eval("x"); 
$4 ==> [SnippetEvent(snippet=Snippet:ErroneousKey#1-x,previousStatus=NONEXISTENT,status=REJECTED,isSignatureChange=false,causeSnippetnull)] 

jshell> js.eval("int x = 2;"); 
$5 ==> [SnippetEvent(snippet=Snippet:VariableKey(x)#2-int x = 2;,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)] 

jshell> js.eval("x"); 
$6 ==> [SnippetEvent(snippet=Snippet:ExpressionKey(x)#3-x,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)] 

Ist es irgendwie möglich geordneten Bereich sichtbar, um das Kind zu machen?

+0

Haben Sie irgendwie bedeuten, aus den Wert 'X' zugreifen ' JShell' instance 'js' in Ihrem Beispiel? – nullpointer

+0

@nullpointer genau – Andremoniy

Antwort

7

Laut this ist die eine große Einschränkung über JShell: es läuft in seiner eigenen JVM.

Die javadoc für create() sagt:.

Entspricht JShell.builder() bauen().

Und wenn Sie auf die javadoc für build() folgen, finden Sie:

Bauen Sie ein JShell Zustand Motor. Dies ist der Einstiegspunkt für alle JShell-Funktionen. Dies erstellt einen Remote-Prozess zur Ausführung. Es ist daher wichtig, die zurückgegebene Instanz zu schließen.

Mit anderen Worten: die meisten wahrscheinlich werden Sie andere JVM Fall, in dem, dass andere Shell-Läufe zu schaffen. Also zumindest für jetzt: keine Chancen, eine Kind jshell über seine Eltern kennen zu lassen.

(wie in: Ich hoffe ernsthaft, dass diese REPL Feature von Java zu einem späteren Zeitpunkt ermöglicht eine JShell zu einem bereits laufenden JVM zu befestigen)

+0

Ja, das stimmt, es startet eine neue JVM. Auf der anderen Seite dachte ich, es könnte eine Art spezieller Methoden in der JShell-Klasse sein, die es ermöglichen, sie irgendwie mit der übergeordneten JShell zu verbinden. Ich neige dazu, deine Antwort zu akzeptieren, aber lass uns ein wenig auf andere Ideen warten. – Andremoniy

+1

@Andremoniy Ich bin an [jython] gewöhnt (http://www.jython.org/) Ich war wirklich sehr enttäuscht, als ich herausfand, dass diese Shell nicht funktionieren kann ** Haken Sie sich in eine bestehende JVM ein. Diese Einschränkung nimmt die Hälfte der "Nützlichkeit" dieser Funktion weg. Aber vielleicht Java 10 oder so und sie reparieren diesen Teil. – GhostCat

Verwandte Themen