JavaScript có thể tương tác với Java không?
GraalVM cung cấp thời gian thực thi ngôn ngữ JavaScript và cho phép khả năng tương tác với mã Java. Tài liệu này mô tả các tính năng và cách sử dụng tính năng tương tác giữa JavaScript với Java này Show
Để tham khảo API công khai GraalVM, hãy xem Khả năng tương thích JavaScript. Xem Tham chiếu nhúng về cách tương tác với ngôn ngữ khách như JavaScript từ ứng dụng máy chủ Java. Hướng dẫn Lập trình Polyglot có thể trợ giúp thêm trong lĩnh vực đó. Hướng dẫn di chuyển cụ thể cho Rhino và Nashorn cũng có sẵn Kích hoạt khả năng tương tác JavaTrong GraalVM, các launcher 1 và 2 được khởi động ở chế độ gốc được biên dịch trước theo mặc định. Trong chế độ đó, khả năng tương tác Java không khả dụngĐể kích hoạt khả năng tương tác của Java, tùy chọn 3 phải được cung cấp cho trình khởi chạy gốc. Bằng cách này, GraalVM JavaScript được thực thi trên một JVM truyền thống và cho phép khả năng tương tác Java đầy đủĐường dẫn lớpĐể tải các lớp Java, bạn cần có chúng trên đường dẫn lớp Java. Bạn có thể chỉ định classpath với tùy chọn 4 (hoặc short. 5)
Phương pháp 6 có thể được sử dụng để lập trình thêm vào đường dẫn lớp khi chạyBối cảnh đa ngôn ngữPhương pháp ưu tiên để khởi chạy JavaScript GraalVM với hỗ trợ tương tác Java là thông qua polyglot 7. Để làm được điều đó, một 8 mới được xây dựng với tùy chọn 9 cho phép truy cập và vị từ 0 xác định các lớp Java mà bạn cho phép truy cập
Xem Tham chiếu nhúng về cách tương tác với ngôn ngữ khách như JavaScript từ ứng dụng máy chủ Java. Hướng dẫn Lập trình Polyglot cũng có thể giúp ích trong lĩnh vực đó ScriptEngine (JSR 223) 8 là phương thức thực thi ưa thích để có khả năng tương tác với các ngôn ngữ và công cụ của GraalVM. Ngoài ra, JavaScript chạy trên GraalVM hoàn toàn tương thích với JSR 223 và hỗ trợ 2. Bên trong, JavaScript ScriptEngine của GraalVM bao bọc một thể hiện ngữ cảnh đa ngôn ngữ
Xem hướng dẫn ScriptEngine để biết thêm chi tiết về cách sử dụng nó từ GraalVM JavaScript Truy cập Java từ JavaScriptGraalVM cung cấp một tập hợp các tính năng cho phép khả năng tương tác từ 3 đến 4. Mặc dù Rhino, Nashorn và GraalVM JavaScript có bộ tính năng tổng thể hầu như có thể so sánh được, nhưng chúng khác nhau về cú pháp chính xác và một phần ngữ nghĩa.Truy cập lớp họcĐể truy cập một lớp Java, GraalVM JavaScript hỗ trợ hàm 5
Theo mặc định, các lớp Java không được ánh xạ tự động tới các biến toàn cục, e. g. , không có thuộc tính toàn cầu 6 trong GraalVM JavaScript. Truy cập mã hiện tại, e. g. , 7, nên được viết lại để sử dụng hàm 8
GraalVM JavaScript cung cấp 9, 6 và các thuộc tính toàn cầu tương tự để tương thích. Tuy nhiên, truy cập rõ ràng vào lớp bắt buộc với 1 được ưu tiên bất cứ khi nào có thể vì hai lý do
Cờ 4 có thể được sử dụng để hủy kích hoạt các trường toàn cầu của các gói Java (đặt 5 để tránh tạo các trường; mặc định là 6)Xây dựng các đối tượng JavaCác đối tượng Java có thể được xây dựng bằng từ khóa 7 của JavaScript
Truy cập trường và phương thứcCó thể truy cập các trường tĩnh của một lớp Java hoặc các trường của một đối tượng Java như các thuộc tính JavaScript
Các phương thức Java có thể được gọi giống như các hàm JavaScript
Chuyển đổi các đối số phương phápJavaScript được xác định để hoạt động trên loại số 8. GraalVM JavaScript có thể sử dụng nội bộ các loại dữ liệu Java bổ sung vì lý do hiệu suất (e. g. , loại 9)Khi gọi các phương thức Java, có thể cần chuyển đổi giá trị. Điều này xảy ra khi phương thức Java mong đợi một tham số 0 và một 9 được cung cấp từ GraalVM JavaScript ( 2). Nếu chuyển đổi này gây ra chuyển đổi bị mất, một 3 sẽ bị ném
Lưu ý cách các giá trị đối số phải khớp với các loại tham số. Bạn có thể ghi đè hành vi này bằng tùy chỉnh Lựa chọn phương phápJava cho phép nạp chồng các phương thức theo kiểu đối số. Khi gọi từ JavaScript sang Java, phương thức có loại khả dụng hẹp nhất mà đối số thực tế có thể được chuyển đổi thành mà không bị mất được chọn 0_______11_______1Để ghi đè hành vi này, có thể chọn quá tải phương thức rõ ràng bằng cú pháp 4. Các loại tham số cần được phân tách bằng dấu phẩy và không có dấu cách và các loại Đối tượng cần phải đủ điều kiện (e. g. , 5). Lưu ý rằng điều này khác với Nashorn cho phép thêm khoảng trắng và tên đơn giản. Trong ví dụ trên, người ta có thể luôn muốn gọi, e. g. , 6, ngay cả khi có thể đạt tới 7 với chuyển đổi không mất dữ liệu ( 8) 2Lưu ý rằng các giá trị đối số vẫn phải phù hợp với các loại tham số. Bạn có thể ghi đè hành vi này bằng tùy chỉnh Lựa chọn phương thức rõ ràng cũng có thể hữu ích khi quá tải phương thức không rõ ràng và không thể tự động giải quyết cũng như khi bạn muốn ghi đè lựa chọn mặc định 3 4Lưu ý rằng hiện tại không có cách nào để chọn quá tải hàm tạo một cách rõ ràng. Các phiên bản tương lai của GraalVM JavaScript có thể loại bỏ hạn chế đó Truy cập góiGraalVM JavaScript cung cấp một thuộc tính toàn cầu 9 5Truy cập mảngGraalVM JavaScript hỗ trợ tạo các mảng Java từ mã JavaScript. Cả hai mẫu được đề xuất bởi Rhino và Nashorn đều được hỗ trợ 6Các mảng được tạo là các kiểu Java, nhưng có thể được sử dụng trong mã JavaScript 7Truy cập bản đồTrong GraalVM JavaScript, bạn có thể tạo và truy cập Bản đồ Java, e. g. , 0 8GraalVM JavaScript hỗ trợ lặp qua các bản đồ tương tự như Nashorn 9Truy cập danh sáchTrong GraalVM JavaScript, bạn có thể tạo và truy cập Danh sách Java, e. g. , 1 0Truy cập chuỗiGraalVM JavaScript có thể tạo các chuỗi Java với khả năng tương tác Java. Độ dài của chuỗi có thể được truy vấn bằng thuộc tính 2 (lưu ý rằng 2 là thuộc tính giá trị và không thể được gọi dưới dạng hàm) 1Lưu ý rằng GraalVM JavaScript sử dụng các chuỗi Java bên trong để biểu diễn các chuỗi JavaScript, vì vậy đoạn mã trên và chuỗi ký tự JavaScript 4 thực sự không thể phân biệt đượcThuộc tính lặp lạiCác thuộc tính (trường và phương thức) của lớp Java và đối tượng Java có thể được lặp lại bằng vòng lặp JavaScript 5 2Truy cập vào các đối tượng JavaScript từ JavaCác đối tượng JavaScript được hiển thị với mã Java dưới dạng phiên bản của 6. Lớp này triển khai giao diện 7 của JavaTrình nhập khẩu JavaTính năng 8 chỉ khả dụng ở chế độ tương thích với Nashorn (tùy chọn ______34_______9)Đầu ra bảng điều khiển của các lớp Java và các đối tượng JavaGraalVM JavaScript cung cấp cả 0 và 1GraalVM JavaScript cung cấp chức năng tích hợp sẵn 0 tương thích với Nashorn 1 được cung cấp bởi Node. js trực tiếp. Nó không cung cấp xử lý đặc biệt cho các đối tượng interop. Lưu ý rằng triển khai mặc định của 1 trên GraalVM JavaScript chỉ là bí danh của 0 và triển khai của Node chỉ khả dụng khi chạy trên Node. jsngoại lệCác ngoại lệ được ném vào mã Java có thể bị bắt trong mã JavaScript. Chúng được biểu diễn dưới dạng các đối tượng Java 3lời hứaGraalVM JavaScript cung cấp hỗ trợ cho khả năng tương tác giữa các đối tượng JavaScript 6 và Java. Các đối tượng Java có thể được tiếp xúc với mã JavaScript dưới dạng các đối tượng có thể sử dụng được, cho phép mã JavaScript 7 đối tượng Java. Hơn nữa, các đối tượng JavaScript 6 là các đối tượng JavaScript thông thường và có thể được truy cập từ Java bằng cách sử dụng các cơ chế được mô tả trong tài liệu này. Điều này cho phép mã Java được gọi lại từ JavaScript khi lời hứa JavaScript được giải quyết hoặc từ chốiTạo JavaScript //Java void longArg (long arg1); void doubleArg (double arg2); void intArg (int arg3); 6 Các đối tượng có thể được giải quyết từ JavaCác ứng dụng JavaScript có thể tạo các đối tượng 6 ủy thác cho Java độ phân giải của đối tượng 6. Điều này có thể đạt được từ JavaScript bằng cách sử dụng một đối tượng Java làm chức năng “thực thi” của JavaScript 6. Ví dụ: các đối tượng Java triển khai giao diện chức năng sau đây có thể được sử dụng để tạo các đối tượng 6 mới 4Bất kỳ đối tượng Java nào triển khai 4 đều có thể được sử dụng để tạo JavaScript 6 5Các đối tượng JavaScript 6 có thể được tạo không chỉ bằng cách sử dụng các giao diện chức năng mà còn bằng cách sử dụng bất kỳ đối tượng Java nào khác có thể được thực thi bởi công cụ JavaScript GraalVM (ví dụ: bất kỳ đối tượng Java nào triển khai giao diện Polyglot ProxyExecutable). Các cách sử dụng ví dụ chi tiết hơn có sẵn trong các bài kiểm tra đơn vị JavaScript GraalVMSử dụng //Java void longArg (long arg1); void doubleArg (double arg2); void intArg (int arg3); 7 với các đối tượng JavaCác ứng dụng JavaScript có thể sử dụng biểu thức 7 với các đối tượng Java. Điều này có thể hữu ích khi Java và JavaScript phải tương tác với các sự kiện không đồng bộ. Để hiển thị một đối tượng Java cho GraalVM JavaScript dưới dạng một đối tượng có thể sử dụng được, đối tượng Java phải triển khai một phương thức có tên là 9 có chữ ký sau 6Khi 7 được sử dụng với một đối tượng Java đang triển khai 9, thời gian chạy JavaScript GraalVM sẽ coi đối tượng là một JavaScript 6. Các đối số 03 và 04 là các đối tượng 05 có thể thực thi được mã Java sử dụng để tiếp tục hoặc hủy bỏ biểu thức JavaScript 7 được liên kết với đối tượng Java tương ứng. Các cách sử dụng ví dụ chi tiết hơn có sẵn trong các bài kiểm tra đơn vị JavaScript GraalVMSử dụng lời hứa JavaScript từ Java 6 các đối tượng được tạo bằng JavaScript có thể được tiếp xúc với mã Java giống như bất kỳ đối tượng JavaScript nào khác. Mã Java có thể truy cập các đối tượng như vậy giống như các đối tượng 05 bình thường, với khả năng đăng ký các hàm giải quyết lời hứa mới bằng cách sử dụng các hàm 9 và 11 mặc định của 6. Ví dụ, đoạn mã Java sau đăng ký một lệnh gọi lại Java sẽ được thực thi khi một lời hứa JavaScript được giải quyết 7Các cách sử dụng ví dụ chi tiết hơn có sẵn trong các bài kiểm tra đơn vị JavaScript GraalVM đa luồngGraalVM JavaScript hỗ trợ đa luồng khi được sử dụng kết hợp với Java. Bạn có thể tìm thêm chi tiết về mô hình đa luồng JavaScript GraalVM trong tài liệu Đa luồng Mở rộng các lớp JavaTrong chế độ JVM ( 3), GraalVM JavaScript cung cấp hỗ trợ để mở rộng các lớp và giao diện Java bằng cách sử dụng hàm 13. Lưu ý rằng quyền truy cập máy chủ phải được bật trong tính năng này để khả dụngJava. mở rộng 14 trả về một đối tượng lớp Java bộ điều hợp được tạo để mở rộng lớp và/hoặc giao diện Java đã chỉ định. Ví dụ 8Các phương thức siêu cấp có thể được gọi thông qua 15. Xem một ví dụ kết hợp 9Lưu ý rằng trong chế độ 16, bạn cũng có thể mở rộng giao diện và lớp trừu tượng bằng cách sử dụng toán tử new trên đối tượng kiểu của giao diện hoặc lớp trừu tượng |