运行 Java在 Java 中使用 Nashorn 导出函数的脚本代码
Run Javascript code with export function in Java with Nashorn
是否可以使用 Nashorn 运行 Java包含导出函数的 Java 脚本代码?我是 Nashorn 的新手,所以我不确定 js 代码是否有限制。另外,如何将 Java 中的参数传递给 js 代码?
Java脚本代码如下所示(取自here):
/** Given two circles (containing a x/y/radius attributes),
returns the intersecting points if possible.
note: doesn't handle cases where there are infinitely many
intersection points (circles are equivalent):, or only one intersection point*/
function circleCircleIntersection(p1, p2) {
var d = distance(p1, p2),
r1 = p1.radius,
r2 = p2.radius;
// if to far away, or self contained - can't be done
if ((d >= (r1 + r2)) || (d <= Math.abs(r1 - r2))) {
return [];
}
var a = (r1 * r1 - r2 * r2 + d * d) / (2 * d),
h = Math.sqrt(r1 * r1 - a * a),
x0 = p1.x + a * (p2.x - p1.x) / d,
y0 = p1.y + a * (p2.y - p1.y) / d,
rx = -(p2.y - p1.y) * (h / d),
ry = -(p2.x - p1.x) * (h / d);
return [{x: x0 + rx, y : y0 - ry },
{x: x0 - rx, y : y0 + ry }];
}
/** Returns the center of a bunch of points */
function getCenter(points) {
var center = {x: 0, y: 0};
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
如何从js代码中获取结果?
Nashorn 不完全 支持 ECMA6 功能,导出是其中之一但不受支持。
参考文献:
http://openjdk.java.net/jeps/292
它开始支持一些来自 JDK8 本身,一些在 JDK9。但是我找不到它支持 export 的证据.
Also how do I pass the arguments from Java to the js code?
If you have the following function
var fun1 = function(name) {
print('Hi there from Javascript, ' + name);
return "greetings from javascript";
};
var fun2 = function (object) {
print("JS Class Definition: " + Object.prototype.toString.call(object));
};
那么,你可以,
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("script.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("fun1", "Peter Parker");
System.out.println(result);
System.out.println(result.getClass());
// Hi there from Javascript, Peter Parker
// greetings from javascript
// class java.lang.String
这取自https://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
是否可以使用 Nashorn 运行 Java包含导出函数的 Java 脚本代码?我是 Nashorn 的新手,所以我不确定 js 代码是否有限制。另外,如何将 Java 中的参数传递给 js 代码?
Java脚本代码如下所示(取自here):
/** Given two circles (containing a x/y/radius attributes),
returns the intersecting points if possible.
note: doesn't handle cases where there are infinitely many
intersection points (circles are equivalent):, or only one intersection point*/
function circleCircleIntersection(p1, p2) {
var d = distance(p1, p2),
r1 = p1.radius,
r2 = p2.radius;
// if to far away, or self contained - can't be done
if ((d >= (r1 + r2)) || (d <= Math.abs(r1 - r2))) {
return [];
}
var a = (r1 * r1 - r2 * r2 + d * d) / (2 * d),
h = Math.sqrt(r1 * r1 - a * a),
x0 = p1.x + a * (p2.x - p1.x) / d,
y0 = p1.y + a * (p2.y - p1.y) / d,
rx = -(p2.y - p1.y) * (h / d),
ry = -(p2.x - p1.x) * (h / d);
return [{x: x0 + rx, y : y0 - ry },
{x: x0 - rx, y : y0 + ry }];
}
/** Returns the center of a bunch of points */
function getCenter(points) {
var center = {x: 0, y: 0};
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
如何从js代码中获取结果?
Nashorn 不完全 支持 ECMA6 功能,导出是其中之一但不受支持。
参考文献:
http://openjdk.java.net/jeps/292
它开始支持一些来自 JDK8 本身,一些在 JDK9。但是我找不到它支持 export 的证据.
Also how do I pass the arguments from Java to the js code? If you have the following function
var fun1 = function(name) {
print('Hi there from Javascript, ' + name);
return "greetings from javascript";
};
var fun2 = function (object) {
print("JS Class Definition: " + Object.prototype.toString.call(object));
};
那么,你可以,
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("script.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("fun1", "Peter Parker");
System.out.println(result);
System.out.println(result.getClass());
// Hi there from Javascript, Peter Parker
// greetings from javascript
// class java.lang.String
这取自https://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/