Java如何在脚本中修改Java对象?

本示例说明如何从脚本环境中修改Java对象。下面我们操作字符串数据的集合。为了将数据传递到脚本引擎,我们使用了键值绑定到脚本引擎。

package org.nhooo.example.script;

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.util.List;
import java.util.ArrayList;

public class ModifiedJavaObjectFromScript {
    public static void main(String[] args) {
        // 创建五种颜色的数组
        List<String> colors = new ArrayList<>();
        colors.add("White");
        colors.add("Black");
        colors.add("Red");
        colors.add("Green");
        colors.add("Blue");

        // 获取一个ScriptEngine实例。
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByExtension("js");

        // 使用colorList键将颜色列表放入引擎中。
        // 将列表设置到引擎中后,我们的脚本将是
        // 能够阅读。
        engine.put("colorList", colors);

        try {
            engine.eval(getScript());

            // 重新显示颜色列表对象的修改后的版本。
            for (String color : colors) {
                System.out.println("Color = " + color);
            }
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    private static String getScript() {
        // 下面是我们的脚本,用于读取以下内容的Java List的值:
        //包含颜色字符串。我们还添加了其他颜色
        // 到脚本环境中的列表对象。
        return "var index; " +
            "var colors = colorList.toArray(); " +
            " " +
            "for (index in colors) { " +
            "    println(colors[index]); " +
            "}" +
            " " +
            "colorList.add(\"Yellow\"); " +
            "colorList.add(\"Purple\"); " +
            "colorList.add(\"Orange\"); ";
    }
}

上面的代码片段的输出是:

White
Black
Red
Green
Blue
Color = White
Color = Black
Color = Red
Color = Green
Color = Blue
Color = Yellow
Color = Purple
Color = Orange