日志文章

2020-1-2 aflfte2011

测试脚本引擎执行javascript代码

package com.aflfte.test;

import java.io.FileReader;
import java.net.URL;
import java.util.List;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**
 * 测试脚本引擎执行javascript代码
 *
 * @author root
 *
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //获得脚本引擎对象
        ScriptEngineManager sem=new ScriptEngineManager();
        ScriptEngine engine=sem.getEngineByName("javascript");
        
        //定义变量后会存储到脚本引擎的上下文中    
        engine.put("msg", "hello world!!");
        String str="var user= {name:'张三',age:18,schools:['北大','清华']};";
        str+="print(user.name);";
        
        //执行脚本
        engine.eval(str);
        engine.eval("msg='hello world!!';");
        System.out.println(engine.get("msg "));
        
        //定义函数
        engine.eval("function add(a,b){var sum=a+b; return sum;}");
        //执行js函数
        //1.取得调用接口
        Invocable jsinv=(Invocable)engine;
        //2.执行脚本中定义的方法
        Object re=jsinv.invokeFunction("add", new Object[] {13,20});
        System.out.println(re);
        /*
        //导入其它的java包使用其它包中的java类
        String jscode="importPackage(java.util); var list=Arrays.asList([\"北京大学\",\"清华大学\",\"南开大学\"]);";
        engine.eval(jscode);
        List<String> list2=(List<String>)engine.get("list");
        for(String temp:list2) {
            System.out.println(temp);
        }
        */
        //执行一个js文件
        URL url=Demo01.class.getClassLoader().getResource("a.js");
        FileReader fr=new FileReader(url.getPath());
        engine.eval(fr);
        fr.close();
        
        
    }
}

« 使用javassist动态生成一个新的类 | 动态编译»