Java代码中使用js脚本示例

197 阅读1分钟

Java代码中使用js脚本示例

public class TestEngine {
    public static void main(String[] args) throws Exception {
        // 获取脚本引擎对象
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("js");
        // 定义变量,存储到引擎的上下文中
        engine.put("user","Jack");
        System.out.println(engine.get("user"));
        // 定义一段js代码,并使用eval方法进行解析
        String str = "var user = {name:'Mic',age:26,school:['清华大学','北京大学','西湖大学']};";
        str += "print(user.name)";
        engine.eval(str);
        // 此处会对上边的js代码的相同变量名进行覆盖
        engine.eval("var user = 'My name is Mic.'");
        engine.eval("var animal = 'Its a Dog'");
        System.out.println("user:" + engine.get("user") + "  ****  animal:" +  engine.get("animal"));

        // 定义函数
        engine.eval("function add(a,b){var sum = a + b;return sum;}");
        // 此处需要强转成Invocable
        Invocable invocable = (Invocable) engine;
        // 执行脚本中定义的方法
        Object result = invocable.invokeFunction("add",new Object[]{10,20});
        System.out.println(result);
        // jdk 1.6中可以使用 importPackage(java.util); var list = Arrays.asList("清华大学","北京大学"); jdk 1.8不适用
        String jsCode = "var list = java.util.Arrays.asList([\"清华大学\",\"北京大学\",\"西湖大学\"])";
        engine.eval(jsCode);

        List<String> list = (List<String>)engine.get("list");
        list.forEach( e -> System.out.println(e));

        ClassLoader classLoader = TestEngine.class.getClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream("a.js");
        InputStreamReader isr = new InputStreamReader(inputStream);
        engine.eval(isr);
    }
}