jdk1.8在java中执行js代码

案例一 变量的存放

     // 得到所有的脚本引擎工厂
        ScriptEngineManager sem = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine engine = sem.getEngineByName("javascript");
        //向上下文中存入变量
        engine.put("msg", "just a test");
        //定义类user
        String str = "msg += '!!!';var user = {name:'tom',age:23,hobbies:['football','basketball']}; ";
        // 开始运行脚本
        engine.eval(str);
        //从上下文引擎中取值
        String msg = (String) engine.get("msg");
        System.out.println(msg);
        Object user = engine.get("user");
        Gson gson = (new GsonBuilder()).setPrettyPrinting().create();
        //System.out.println(gson.toJson(user));

        //可用指定不同scope进行获取值
        ScriptContext context = engine.getContext();
        Object user1 = context.getAttribute("user");
        //System.out.println(gson.toJson(user1));
        HashMap o = Demo1.toType(user, HashMap.class);
        System.out.println(o);

  案例二 运行js函数

     // 得到所有的脚本引擎工厂
        ScriptEngineManager sem = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine engine = sem.getEngineByName("javascript");


        //定义数学函数
        engine.eval("function add (a, b) {c = a + b; return c; }");
        //取得调用接口
        Invocable jsInvoke = (Invocable) engine;
        //定义加法函数

        Object result1 = jsInvoke.invokeFunction("add", new Object[]{10, 5});
        System.out.println(result1);

  案例三 定义线程运行

      // 得到所有的脚本引擎工厂
        ScriptEngineManager sem = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine engine = sem.getEngineByName("javascript");
        // 定义run()函数
        engine.eval("function run() {print('www.java2s.com');}");
        Invocable invokeEngine = (Invocable) engine;
        Runnable runner = invokeEngine.getInterface(Runnable.class);
        //定义线程运行之
        Thread t = new Thread(runner);
        t.start();
        t.join();

  案例四 在js中引用java的包

/*
        *
        * 一.
            //jdk1.6的使用方法规则 1.8已经不适用了
            String jsCode = "importPackage java.util; var list = Arrays.asList([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);";

            //jkd1.8的使用规则如下:
            String jsCode1 = "var list = java.util.Arrays.asList([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);";

            二.如果出现 "println" is not defined in <eval>,  则将"println"改"print"
        * */


        // 得到所有的脚本引擎工厂
        ScriptEngineManager sem = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine engine = sem.getEngineByName("javascript");
        // 导入其他java包
        String jsCode = "var list2 = java.util.Arrays" +
                ".asList(['A', 'B', 'C']); ";
        engine.eval(jsCode);
        List<String> list2 = (List<String>) engine.get("list2");
        for (String val : list2) { System.out.println(val);}

  案例五 加载本地的js文件并执行

 ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        String jsFileName = "C:\\Users\\13900\\Desktop\\javajs\\src\\test" +
                "\\java\\test\\expression.js";

        // 读取js文件
        FileReader reader = new FileReader(jsFileName);
        // 执行指定脚本
        engine.eval(reader);
        if(engine instanceof Invocable) {
            Invocable invoke = (Invocable)engine;
            // 调用merge方法,并传入两个参数
            // c = merge(2, 3);
            Double c = (Double)invoke.invokeFunction("merge", 2, 3);
            System.out.println("c = " + c);
        }
        reader.close();

  *将数据对象转换成java中指定的数据结构,需要引入谷歌Gson依赖包

 //将数据对象转换成指定的java中指定的数据结构
    public static <T> T toType(Object obj, Type type, Type... typeArguments) {
        Gson gson = new Gson();
        JsonElement je = gson.toJsonTree(obj);
        return (T) (typeArguments != null && typeArguments.length != 0 ? gson.fromJson(je, TypeToken.getParameterized(type, typeArguments).getType()) : gson.fromJson(je, type));
    }

  

ScriptEngine东西很多
具体可以查阅官方文档 https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngine.html

 


posted @ 2020-09-29 16:02  D·Felix  阅读(759)  评论(0编辑  收藏  举报