我有一个带有方法(A)的java应用程序,它应该使用一个用rhino评估的javascript函数(B)来更改一些对象,然后再用A返回它们。关键是,从A内部传递到B的参数很复杂(List) 以及从 B 返回的类型应该来自相同的类型。目前我不知道如何在 javascript 函数中使用我自己的类。我应该在 JavaScript 中向谁导入它们?
我使用rhino 如何从 java 调用 js 函数来加载和运行我的 javascript 函数。
提前致谢!
我有一个带有方法(A)的java应用程序,它应该使用一个用rhino评估的javascript函数(B)来更改一些对象,然后再用A返回它们。关键是,从A内部传递到B的参数很复杂(List) 以及从 B 返回的类型应该来自相同的类型。目前我不知道如何在 javascript 函数中使用我自己的类。我应该在 JavaScript 中向谁导入它们?
我使用rhino 如何从 java 调用 js 函数来加载和运行我的 javascript 函数。
提前致谢!
见例子。它使用 jsr223,但你会明白的。我将带有 MyClass 的一个实例的列表传递给 rhino,它对其进行了修改(通过 java 方法调用),最后将另一个元素添加到列表中。
package lv.test;
import java.util.ArrayList;
import java.util.List;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class MyClass {
private int field;
public int getField() {
return field;
}
public void setField(final int field) {
this.field = field;
}
public String toString() {
return String.format("{%d}", field);
}
public static void main(String[] args) throws ScriptException {
final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine e = manager.getEngineByName("js");
final Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
final List<MyClass> somelist = new ArrayList<MyClass>();
somelist.add(new MyClass());
b.put("somelist", somelist);
final StringBuilder script = new StringBuilder()
.append("function abc(x,y) { return x+y+new java.lang.Integer(2).intValue(); }")
.append("somelist.get(0).setField(abc(2,3));")
.append("somelist.add(new Packages.lv.test.MyClass()); somelist.get(1).setField(888);");
e.eval(script.toString());
System.out.println(somelist); // [{7}, {888}]
}
}