使用 GraalVM 将 Java 对象公开给 JavaScript,我ProxyObject
用来包装它们。为此,我使用ProxyObject.fromMap
如下方法:
ProxyObject exposedObject = ProxyObject.fromMap(objectMapper.convertValue(javaObject, Map.class));
在这里,javaObject
是Object
类的,可以任意复杂。此方法适用于 的直接成员javaObject
,但不适用于成员本身是复杂对象的情况。例如,如果其中一个成员javaObject
恰好是 a 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);
exposedObject
这是在 JavaScript 中访问时发生的情况:
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
s 中?或者是否有支持的开箱即用的方法来实现这一点?
另外,如果我的方法需要改变,请告诉我。