Доступ к родительской области в JShell

Похоже, что объект JShell, созданный внутри другого объекта JShell, не имеет доступа к родительской области JShell. Например:

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

jshell> x
x ==> 1

jshell> jdk.jshell.JShell js = jdk.jshell.JShell.create();
js ==> jdk.jshell.JShell@1a052a00

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)]

Можно ли как-то сделать родительскую область видимой для дочерней?


person Andremoniy    schedule 14.09.2017    source источник
comment
Вы хотите каким-то образом получить доступ к значению x из JShell экземпляра js в вашем образце?   -  person Naman    schedule 14.09.2017
comment
@nullpointer точно   -  person Andremoniy    schedule 14.09.2017


Ответы (1)


Согласно этому есть одно большое предостережение относительно JShell: он работает на своей собственной JVM.

Документ Javadoc для create()< /а> говорит:

Эквивалент JShell.builder().build().

И когда вы переходите к javadoc для build() вы обнаружите:

Создайте механизм состояний JShell. Это точка входа для всех функций JShell. Это создает удаленный процесс для выполнения. Таким образом, важно закрыть возвращаемый экземпляр.

Другими словами: скорее всего, вы создаете еще один экземпляр JVM, в котором работает эта другая оболочка. Так что, по крайней мере, на данный момент: нет шансов, что дочерний jshell узнает о своем родителе.

(например: я серьезно надеюсь, что эта функция REPL в Java позволит в какой-то момент в будущем подключить JShell к уже работающей JVM)

person GhostCat    schedule 14.09.2017
comment
Да, это правда, он запускает новую JVM. С другой стороны, я думал, что это могут быть какие-то специальные методы в классе JShell, которые позволяют как-то связать его с родительским JShell. Я склонен принять ваш ответ, но давайте немного подождем других идей - person Andremoniy; 14.09.2017
comment
@Andremoniy Привыкнув к jython, я был действительно очень разочарован, узнав, что jshell не может подключиться к существующей JVM. Это ограничение отнимает половину полезности этой функции. Но, может быть, Java 10 или около того, и они исправят эту часть. - person GhostCat; 14.09.2017