[英]GraalVM - Exposing Java complex objects to JavaScript
使用 GraalVM 將 Java 對象公開給 JavaScript,我使用ProxyObject
來包裝它們。 為此,我使用了ProxyObject.fromMap
方法,如下所示:
ProxyObject exposedObject = ProxyObject.fromMap(objectMapper.convertValue(javaObject, Map.class));
這里, javaObject
屬於Object
類,可以任意復雜。 此方法適用於javaObject
直接成員,但不適用於成員本身是復雜對象。 例如,如果javaObject
的成員之一恰好是Map
,例如:
final Map<String, Object> source = new HashMap<>();
source.put("id", "1234567890");
final Map<String, Object> sourceComponent = ImmutableMap.of("key", "value");
source.put("complex", sourceComponent);
// assuming the source is any object
ProxyObject exposedObject = ProxyObject.fromMap(objectMapper.convertValue(source, Map.class));
// or knowing that source is in fact a map
ProxyObject exposedObject = ProxyObject.fromMap(source);
這是在 JavaScript 中訪問exposedObject
對象時發生的情況:
exposedObject; // returns {complex: JavaObject[com.google.common.collect.SingletonImmutableBiMap], id: "1234567890"}
exposedObject.id; // returns 01234567890
exposedObject.complex; // returns {key=value}
exposedObject.complex.key; // returns undefined
所以我的問題是我們如何將一個任意復雜和深度的 java 對象完全暴露給 javascript。 我們是否必須遞歸遍歷所有成員並將它們包裝到ProxyObject
? 或者是否有支持的開箱即用的方法來實現這一點?
另外,如果我的方法需要改變,請告訴我。
正如 ProxyObject [1] 的 javadoc 所說:“要實現的接口以模仿包含成員的來賓語言對象。”。 這意味着,如果您希望 Java 對象在 JavaScript 中使用,就好像它是 JavaScript 本機的一樣,它需要是一個 ProxyObject。
另一方面,正如網站文檔 [2] 所示,傳遞給 JavaScript 的 Java 對象仍然可以用作 Java 對象(即默認情況下它們不模仿 JS 對象)。 這意味着您可以訪問字段、調用方法等。網站文檔顯示了一個示例:
public static class MyClass {
public int id = 42;
public String text = "42";
public int[] arr = new int[]{1, 42, 3};
public Callable<Integer> ret42 = () -> 42;
}
public static void main(String[] args) {
try (Context context = Context.newBuilder()
.allowAllAccess(true)
.build()) {
context.getBindings("js").putMember("javaObj", new MyClass());
boolean valid = context.eval("js",
" javaObj.id == 42" +
" && javaObj.text == '42'" +
" && javaObj.arr[1] == 42" +
" && javaObj.ret42() == 42")
.asBoolean();
assert valid == true;
}
}
[1] https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/proxy/ProxyObject.html
[2] https://www.graalvm.org/reference-manual/embed-languages/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.