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
Để 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 Java
Trong GraalVM, các launcher
var FileClass = Java.type['java.io.File'];
1 và var FileClass = Java.type['java.io.File'];
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
var FileClass = Java.type['java.io.File'];
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
var FileClass = Java.type['java.io.File'];
4 [hoặc short. var FileClass = Java.type['java.io.File'];
5]node --jvm --vm.cp=/my/class/path
js --jvm --vm.cp=/my/class/path
Phương pháp
var FileClass = Java.type['java.io.File'];
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
var FileClass = Java.type['java.io.File'];
7. Để làm được điều đó, một var FileClass = Java.type['java.io.File'];
8 mới được xây dựng với tùy chọn var FileClass = Java.type['java.io.File'];
9 cho phép truy cập và vị từ //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
0 xác định các lớp Java mà bạn cho phép truy cậpContext context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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]
var FileClass = Java.type['java.io.File'];
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ợ //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
2. Bên trong, JavaScript ScriptEngine của GraalVM bao bọc một thể hiện ngữ cảnh đa ngôn ngữScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
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ừ JavaScript
GraalVM 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ừ
//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
3 đến //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
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
//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
5var FileClass = Java.type['java.io.File'];
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
//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
6 trong GraalVM JavaScript. Truy cập mã hiện tại, e. g. , //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
7, nên được viết lại để sử dụng hàm //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
8//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
GraalVM JavaScript cung cấp
//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
9, //GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
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 var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
1 được ưu tiên bất cứ khi nào có thể vì hai lý do- Nó cho phép giải quyết lớp trong một bước thay vì cố gắng giải quyết từng thuộc tính dưới dạng một lớp
1 ngay lập tức ném mộtvar FileClass = Java.type['java.io.File']; var file = new FileClass["myFile.md"];
3 nếu lớp không thể tìm thấy hoặc không thể truy cập được, thay vì âm thầm coi một tên chưa được giải quyết như một góivar FileClass = Java.type['java.io.File']; var file = new FileClass["myFile.md"];
Cờ
var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
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 var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
5 để tránh tạo các trường; mặc định là var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
6]Xây dựng các đối tượng Java
Các đối tượng Java có thể được xây dựng bằng từ khóa
var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
7 của JavaScriptvar FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
Truy cập trường và phương thức
Có 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
var JavaPI = Java.type['java.lang.Math'].PI;
Các phương thức Java có thể được gọi giống như các hàm JavaScript
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
Chuyển đổi các đối số phương pháp
JavaScript được xác định để hoạt động trên loại số
var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
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 var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
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ố
var JavaPI = Java.type['java.lang.Math'].PI;
0 và một var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
9 được cung cấp từ GraalVM JavaScript [var JavaPI = Java.type['java.lang.Math'].PI;
2]. Nếu chuyển đổi này gây ra chuyển đổi bị mất, một var FileClass = Java.type['java.io.File'];
var file = new FileClass["myFile.md"];
3 sẽ bị ném//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
//JavaScript
javaObject.longArg[1]; //widening, OK
javaObject.doubleArg[1]; //widening, OK
javaObject.intArg[1]; //match, OK
javaObject.longArg[1.1]; //lossy conversion, TypeError!
javaObject.doubleArg[1.1]; //match, OK
javaObject.intArg[1.1]; //lossy conversion, TypeError!
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áp
Java 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
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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
var JavaPI = Java.type['java.lang.Math'].PI;
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. , var JavaPI = Java.type['java.lang.Math'].PI;
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. , var JavaPI = Java.type['java.lang.Math'].PI;
6, ngay cả khi có thể đạt tới var JavaPI = Java.type['java.lang.Math'].PI;
7 với chuyển đổi không mất dữ liệu [var JavaPI = Java.type['java.lang.Math'].PI;
8]Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
3Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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ói
GraalVM JavaScript cung cấp một thuộc tính toàn cầu
//GraalVM JavaScript compliant syntax
var FileClass = Java.type["java.io.File"];
//backwards-compatible syntax
var FileClass = java.io.File;
9Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
5Truy cập mảng
GraalVM 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ợ
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
6Các mảng được tạo là các kiểu Java, nhưng có thể được sử dụng trong mã JavaScript
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
7Truy cập bản đồ
Trong GraalVM JavaScript, bạn có thể tạo và truy cập Bản đồ Java, e. g. ,
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
0Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
8GraalVM JavaScript hỗ trợ lặp qua các bản đồ tương tự như Nashorn
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
9Truy cập danh sách
Trong GraalVM JavaScript, bạn có thể tạo và truy cập Danh sách Java, e. g. ,
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
1ScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
0Truy cập chuỗi
GraalVM 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
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
2 [lưu ý rằng var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
2 là thuộc tính giá trị và không thể được gọi dưới dạng hàm]ScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
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
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
4 thực sự không thể phân biệt đượcThuộc tính lặp lại
Cá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
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
5ScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
2Truy cập vào các đối tượng JavaScript từ Java
Các đối tượng JavaScript được hiển thị với mã Java dưới dạng phiên bản của
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
6. Lớp này triển khai giao diện var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
7 của JavaTrình nhập khẩu Java
Tính năng
var file = new [Java.type['java.io.File']]["test.md"];
var fileName = file.getName[];
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 Java
GraalVM JavaScript cung cấp cả
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
0 và //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
1GraalVM JavaScript cung cấp chức năng tích hợp sẵn
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
0 tương thích với Nashorn//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
1 trên GraalVM JavaScript chỉ là bí danh của //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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
ScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
3lời hứa
GraalVM JavaScript cung cấp hỗ trợ cho khả năng tương tác giữa các đối tượng JavaScript
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
7 đối tượng Java. Hơn nữa, các đối tượng JavaScript //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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ừ Java
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
Các ứng dụng JavaScript có thể tạo các đối tượng
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
6 ủy thác cho Java độ phân giải của đối tượng //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
6 mớiScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
4Bất kỳ đối tượng Java nào triển khai
//JavaScript
javaObject.longArg[1]; //widening, OK
javaObject.doubleArg[1]; //widening, OK
javaObject.intArg[1]; //match, OK
javaObject.longArg[1.1]; //lossy conversion, TypeError!
javaObject.doubleArg[1.1]; //match, OK
javaObject.intArg[1.1]; //lossy conversion, TypeError!
4 đều có thể được sử dụng để tạo JavaScript //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
6ScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
5Các đối tượng JavaScript
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 Java
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
Các ứng dụng JavaScript có thể sử dụng biểu thức
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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à //JavaScript
javaObject.longArg[1]; //widening, OK
javaObject.doubleArg[1]; //widening, OK
javaObject.intArg[1]; //match, OK
javaObject.longArg[1.1]; //lossy conversion, TypeError!
javaObject.doubleArg[1.1]; //match, OK
javaObject.intArg[1.1]; //lossy conversion, TypeError!
9 có chữ ký sauScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
6Khi
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
7 được sử dụng với một đối tượng Java đang triển khai //JavaScript
javaObject.longArg[1]; //widening, OK
javaObject.doubleArg[1]; //widening, OK
javaObject.intArg[1]; //match, OK
javaObject.longArg[1.1]; //lossy conversion, TypeError!
javaObject.doubleArg[1.1]; //match, OK
javaObject.intArg[1.1]; //lossy conversion, TypeError!
9, thời gian chạy JavaScript GraalVM sẽ coi đối tượng là một JavaScript //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
6. Các đối số Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
03 và Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
04 là các đối tượng Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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 //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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
//Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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 Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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 //JavaScript
javaObject.longArg[1]; //widening, OK
javaObject.doubleArg[1]; //widening, OK
javaObject.intArg[1]; //match, OK
javaObject.longArg[1.1]; //lossy conversion, TypeError!
javaObject.doubleArg[1.1]; //match, OK
javaObject.intArg[1.1]; //lossy conversion, TypeError!
9 và Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
11 mặc định của //Java
void longArg [long arg1];
void doubleArg [double arg2];
void intArg [int arg3];
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ếtScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
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ồng
GraalVM 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 Java
Trong chế độ JVM [
var FileClass = Java.type['java.io.File'];
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 Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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ụScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
8Các phương thức siêu cấp có thể được gọi thông qua
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
15. Xem một ví dụ kết hợpScriptEngine eng = new ScriptEngineManager[]
.getEngineByName["graal.js"];
Object fn = eng.eval["[function[] { return this; }]"];
Invocable inv = [Invocable] eng;
Object result = inv.invokeMethod[fn, "call", fn];
9Lưu ý rằng trong chế độ
Context context = Context.newBuilder["js"]
.allowHostAccess[HostAccess.ALL]
//allows access to all Java classes
.allowHostClassLookup[className -> true]
.build[];
context.eval["js", jsSourceCode];
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