/* * Test.java * * Created on 2007-9-19, 15:28:49 * * To change this template, choose Tools | Templates * and open the template in the editor. */
package lbf.script;
import java.io.FileReader; import java.util.ArrayList; import java.util.List; import javax.script.Bindings; import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.Swing.JFrame;
/** * * @author hadeslee */ public class Test {
public static void main(String[] args)throws Exception { //根据js的后缀名生成一个解析JS的脚本解析引擎 ScriptEngine engin=new ScriptEngineManager().getEngineByExtension("js"); //查询一下这个引擎是否实现了下面很实用的接口 System.out.println(engin instanceof Invocable); //声明两个对象,传入到JS里面去 JFrame jf=new JFrame("test"); List<String> list=new ArrayList<String>(); //得到挷定的键值对象,把当前的两个JAVA对象放进去 Bindings bind=engin.createBindings(); bind.put("jf",jf); bind.put("list",list); //把挷下的键值对象放进去,作用域是当前引擎的范围 engin.setBindings(bind, ScriptContext.ENGINE_SCOPE); //用引擎执行一段写在JS文件里面的代码 Object obj=engin.eval(new FileReader("test.js")); //这个时候返回值当然 是null了 System.out.println(obj); //把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了 Invocable in=(Invocable)engin; //得到了从JS里面返回来的对象 List<String> l=(List<String>)in.invokeFunction("getNames"); System.out.println(l); //调用一下定义在JS里面的另一个函数 in.invokeFunction("testJS"); //最后调用一个函数,该函数可以使我们前面定义的窗体显示出来 in.invokeFunction("doSth"); } } |