2017-09-14 51 views
7

看起来,在另一个JShell内部创建的对象JShell不能访问父级的JShell范围。例如:访问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)] 

是否有可能让子作用域对父子作用域可见?

+0

你的意思以某种方式访问​​x'的''从价值你样本中的JShell'实例'js'? – nullpointer

+0

@nullpointer究竟是 – Andremoniy

回答

7

根据this关于JShell的一个大问题是:它运行在其自己的 JVM中。

create()的Javadoc说:

相当于JShell.builder()建()。

而当你遵循的Javadoc build(),你会发现:

建立JShell状态引擎。这是所有JShell功能的入口点。这创建了用于执行的远程过程。因此关闭返回的实例非常重要。

换句话说:最有可能的,你正在创建另一 JVM实例,其中,其他壳运行。所以至少现在:jshell不知道其父母是否具有孩子的机会。

(如:我认真地希望此Java REPL功能将允许在未来的某个时刻到JShell附加到一个已经运行的JVM)

+0

是的,这是真的,它启动一个新的JVM。另一方面,我认为它可能是JShell类中的某种特殊方法,它允许以某种方式将它与父级JShell进行绑定。我倾向于接受你的答案,但让我们稍微等待其他想法 – Andremoniy

+1

@Andremoniy习惯于[jython](http://www.jython.org/)我真的很失望,发现jshell可以** **挂钩到现有的JVM中。这一限制带走了该功能的一半“有用性”。但也许Java 10左右,他们修复这部分。 – GhostCat