2017-09-14 17 views
7

Có vẻ như, đối tượng JShell được tạo bên trong một số JShell khác không có quyền truy cập vào phạm vi JShell của cha mẹ. Ví dụ:Truy cập vào "phạm vi gốc" trong 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)] 

Bằng cách nào đó, có thể hiển thị phạm vi cha mẹ cho con không?

+0

Bạn có nghĩa là bằng cách nào đó để truy cập giá trị của 'x' từ' JShell' instance 'js' trong mẫu của bạn? – nullpointer

+0

@nullpointer chính xác – Andremoniy

Trả lời

7

Theo this một thông báo lớn về JShell là: nó chạy trong số riêng của mình JVM.

Các javadoc cho create() nói:.

Tương đương với JShell.builder() xây dựng().

Và khi bạn làm theo để javadoc cho build(), bạn thấy:

xây dựng một cơ nhà nước JShell. Đây là entry-point cho tất cả các chức năng của JShell. Điều này tạo ra một quá trình từ xa từ xa để thực thi. Do đó, việc đóng trường hợp trả về là rất quan trọng.

Nói cách khác: nhiều khả năng, bạn đang tạo một ví dụ khác JVM nơi vỏ khác chạy. Vì vậy, ít nhất là bây giờ: không có cơ hội có một con số jshell biết về cha mẹ của nó.

(như trong: Tôi nghiêm túc hy vọng rằng tính năng REPL này của Java sẽ cho phép tại một số điểm trong tương lai để đính kèm một JShell một JVM đang chạy)

+0

Đúng, đó là sự thật, nó bắt đầu một JVM mới. Mặt khác, tôi nghĩ rằng nó có thể là một số loại phương pháp đặc biệt trong lớp JShell cho phép để ràng buộc bằng cách nào đó nó với phụ huynh JShell. Tôi có xu hướng chấp nhận câu trả lời của bạn, nhưng chúng ta hãy chờ một chút cho các ý tưởng khác – Andremoniy

+1

@Andremoniy Được sử dụng để [jython] (http://www.jython.org/) Tôi đã thực sự thực sự thất vọng khi phát hiện ra rằng jshell có thể ** không ** móc vào một JVM hiện có. Hạn chế này sẽ lấy đi một nửa "tính hữu ích" của tính năng này. Nhưng có lẽ Java 10 hoặc hơn và họ sửa chữa phần đó. – GhostCat

Các vấn đề liên quan