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

Để 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ạy

Bố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ập

Context 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;
5

var 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

  1. 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
  2. var FileClass = Java.type('java.io.File');
    var file = new FileClass("myFile.md");
    
    1 ngay lập tức ném một
    var 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ói

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 JavaScript

var 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);
2

Lư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);
3
Context context = Context.newBuilder("js")
    .allowHostAccess(HostAccess.ALL)
    //allows access to all Java classes
    .allowHostClassLookup(className -> true)
    .build();
context.eval("js", jsSourceCode);
4

Lư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;
9

Context context = Context.newBuilder("js")
    .allowHostAccess(HostAccess.ALL)
    //allows access to all Java classes
    .allowHostClassLookup(className -> true)
    .build();
context.eval("js", jsSourceCode);
5

Truy 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);
6

Cá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);
7

Truy 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();
0

Context context = Context.newBuilder("js")
    .allowHostAccess(HostAccess.ALL)
    //allows access to all Java classes
    .allowHostClassLookup(className -> true)
    .build();
context.eval("js", jsSourceCode);
8

GraalVM 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);
9

Truy 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();
1

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);
0

Truy 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);
1

Lư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 được

Thuộ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();
5

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);
2

Truy 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 Java

Trì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);
1

GraalVM 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. js

ngoạ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);
3

lờ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ối

Tạ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

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ới

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);
4

Bấ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);
6

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);
5

Cá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 GraalVM

Sử dụng //Java void longArg (long arg1); void doubleArg (double arg2); void intArg (int arg3); 7 với các đối tượng Java

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ý sau

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);
6

Khi

//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 GraalVM

Sử 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ết

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

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 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ụng

Java. 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);
8

Cá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ợp

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);
9

Lư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