【问题标题】:Call a JavaScript-Function from within Java with complex Objects as parameters使用复杂对象作为参数从 Java 中调用 JavaScript 函数
【发布时间】:2012-07-14 01:04:00
【问题描述】:

我有一个带有方法 (A) 的 java 应用程序,它应该使用 rhino 评估的 javascript 函数 (B) 来更改一些对象,然后再用 A 返回它们。关键是,参数从 A 内部传递到B 是复杂的(列表),并且 B 的返回类型应该来自相同的类型。 目前我不知道如何在 javascript 函数中使用我自己的类。我应该在 JavaScript 中将它们导入谁?

我使用rhino how to call js function from java 来加载和运行我的javascript 函数。

提前致谢!

【问题讨论】:

  • 将什么导入javascript?你的java类?
  • @MaVRoSCy:是的,我想在 JavaScript 中使用我自己的类。序列化为 JSON 是我的一个想法……

标签: java javascript rhino


【解决方案1】:

参见示例。它使用 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}]
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多