gpt4 book ai didi

javascript - 使用 Nashorn 将 ScriptObjectMirror 转换为其他 Java 类

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:14 28 4
gpt4 key购买 nike

我想将 ScriptObjectMirror 对象转换为我自己定义的其他名为 Point 的类,如下所示:

public class Point {

public double x;
public double y;

public Point(double x, double y) {
this.x=x;
this.y=y;
}

}

我的 JavaScript 代码是这样的:

function getCenter(points) {
var center = {x: 0, y: 0};
print(points);
print(points.length);
for (var i =0; i < points.length; ++i ) {
center.x += points[i].x;
center.y += points[i].y;
}
center.x /= points.length;
center.y /= points.length;
return center;
}

我想通过使用代码提供多个点来调用 js 中的 getCenter 函数:

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
// engine.eval("print('Hello World!');");
engine.eval(new FileReader("circleintersection.js"));

Invocable invocable = (Invocable) engine;

Point a = new Point(3,2);
Point b = new Point(5,3);
Point c = new Point(1,4);
Point d = new Point(2,5);
Point e = new Point(6,6);

Point[] points = {a,b,c,d,e};

Point result = (Point) invocable.invokeFunction("getCenter", points);
System.out.println(result.x);

但是它给了我类似的错误

Exception in thread "main" java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to Point

我尝试了另一种方法来使用代码转换为 map :

@SuppressWarnings("restriction")
private static Object convertIntoJavaObject(Object scriptObj) {
if (scriptObj instanceof ScriptObjectMirror) {
ScriptObjectMirror scriptObjectMirror = (ScriptObjectMirror) scriptObj;
if (scriptObjectMirror.isArray()) {
List<Object> list = Lists.newArrayList();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
list.add(convertIntoJavaObject(entry.getValue()));
}
return list;
} else {
Map<String, Object> map = Maps.newHashMap();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
map.put(entry.getKey(), convertIntoJavaObject(entry.getValue()));
}
return map;
}
} else {
return scriptObj;
}
}

在 main() 方法中,代码如下:

ScriptObjectMirror result = (ScriptObjectMirror) invocable.invokeFunction("getCenter", points);
Object con = convertIntoJavaObject(result);
Map<String, Object> map = (Map<String, Object>) con;
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}

但它打印 x:NaN 和 y:NaN 作为结果。

我将变量插入 JavaScript 代码的方式或如何获取结果是否有问题?

最佳答案

当您尝试将以下打印语句添加到脚本中时,(您还向 Point 类添加了 toString)

print(points);   
print(points.length);

你可以看到它打印出来了,

Point(x=3.0, y=2.0) //the first point
undefined

因此,很明显,只有数组中的第一个值会传递给 JavaScript 函数。由于 points.length 未定义,因此您会在 javascript 代码本身中得到 NaN。

我找不到原因(如果我能找到有效的解释,我会更新我的答案)

但是如果您愿意更改 JavaScript 代码以使用参数,则可以解决此问题

function getCenter() {
var center = {x: 0, y: 0};
for (var i =0; i < arguments.length; ++i ) {
center.x += arguments[i].x;
center.y += arguments[i].y;
}
center.x /= arguments.length;
center.y /= arguments.length;
return center;
}

参见:Is it possible to send a variable number of arguments to a JavaScript function?

关于javascript - 使用 Nashorn 将 ScriptObjectMirror 转换为其他 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057611/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com