在Java中运行JS面对的一大问题就是对象类型问题,本文对graaljs和Java之间不同类型的数据操作做了一些探索。
项目采用maven引入graaljs
pom依赖
<properties>
<java.version>1.8</java.version>
<graalvm.version>22.1.0.1</graalvm.version>
</properties>
<dependencies>
<!-- fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.3</version>
</dependency>
<!-- graaljs 相关依赖 -->
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js-scriptengine</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>profiler</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>chromeinspector</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
resource/a.js
const f = p => {
p.a = "def";
let r = {};
r.msg = p;
return r;
}
GraalJsDemo.java
package com.m.demo;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.iauto.mqtt.ruleengine.MqttRuleEngineApplication;
import javax.script.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.net.URL;
import java.util.function.Predicate;
public class GraalJsDemo {
public static void main(String[] args) {
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine jsEngine = engineManager.getEngineByName("graal.js");
Invocable funcCall = (Invocable) jsEngine;
Bindings bindings = jsEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
bindings.put("polyglot.js.allowHostClassLookup", (Predicate<String>) s -> true);
try {
URL jsResource = MqttRuleEngineApplication.class.getClassLoader().getResource("a.js");
System.out.println("read file: " + jsResource.getPath());
jsEngine.eval(new FileReader(jsResource.getPath()));
JSONObject jsonObject = new JSONObject();
jsonObject.put("a", "abc");
Object res= funcCall.invokeFunction("f", jsonObject);
System.out.println("invoke param: " + jsonObject);
System.out.println("invoke result type: " + res.getClass().getName());
System.out.println("invoke result: " + res);
System.out.println("invoke result: " + JSON.toJSONString(res));
} catch (ScriptException e) {
throw new RuntimeException(e);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
}
输出:
invoke param: {"a":"def"}
invoke result type: com.oracle.truffle.polyglot.PolyglotMap
invoke result: {msg: JavaObject[com.alibaba.fastjson2.JSONObject]}
invoke result: {"msg":{"a":"def"}}
版权声明:本文为csdn_meng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。