zoukankan      html  css  js  c++  java
  • 8.4(Java学习笔记)java脚本引擎(Rhino)

    一、java脚本引擎

      java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的脚本引擎在java中调用各种脚本语言。

    二、脚本引擎执行脚本代码

      ScriptEngineManager:为ScriptEngine提供实例化机制。

      方法:getEngineByName(String shortName);//查找并创建指定名称的脚本引擎

      

      ScriptEngine:是一个接口,该接口提供了基本的脚本功能(包括执行脚本,设置和获取值的方法)。

      方法:get(String key);//获取指定key所对应的值,这里的key看做变量名称,值看做变量名所对应的值。

         eval(String script);//执行指定的脚本代码

         eval(Reader reader);//执行指定的脚本文件

      java执行JavaScript脚本步骤:

      1.获取脚本引擎

      2.指定脚本名称

      3.编写脚本语句

      4.执行脚本

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    
    public class TestRhino {
        public static void main(String[] args) throws ScriptException {
            //获取脚本引擎,并指定脚本语言
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("javascript");
            //定义上下文变量,被脚本和java共享
            engine.put("msg", "javascript");
            //定义脚本代码
            String str = "var user = {name:'hcf',age:19,sex:'man'};";
            str+="print(user.name);";
            //执行脚本
            engine.eval(str);
            System.out.println("修改前的内容:"+engine.get("msg"));
            engine.eval("msg ='java';");//修改msg内容
            System.out.println("修改后的内容:"+engine.get("msg"));
            
        }
    }
    运行结果:
    hcf 修改前的内容javascript 修改后的内容java

    三、脚本引擎执行脚本方法

      1.执行脚本方法,首先肯定是要在脚本中定义方法,然后执行。

      2.执行时需要将engine转换为Invcable,然后调用其中的invokeFun

      Invocable:由ScriptEngines实现的可选接口,其方法允许调用先前已执行的脚本中的程序(方法)。

      3.调用Object invokeFunction(String name, Object... args);执行指定方法。

      name为方法名称,args为方法参数,返回是一个Object对象 

      

    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    
    public class TestRhino {
        public static void main(String[] args) throws ScriptException {
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("javascript");
            //定义方法的字符串形式
            String funAdd = "function add(a,b){"
                        + "      var sum = a + b;"
                        + "     return sum;"
                        + "  }";
            engine.eval(funAdd);//这一步可以看做将方法写入脚本
            Invocable invo = (Invocable)engine;//转换成Invocable
            Object result = null;
            try {
                //执行脚本中方法
                result = invo.invokeFunction("add",new Object[]{17,23});
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(result);
        }
    }
    运行结果:
    40.0

    四、脚本引擎执行脚本文件

      1、执行脚本文件,首先我们要指定文件的路径。

      2、通过这个路径构建一个Reader对象

      3、调用eval(Reader reader);//执行指定的脚本文件

    脚本文件内容 

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.Reader;
    
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    
    public class TestRhino {
        public static void main(String[] args) throws ScriptException {
            //E:eclipseRhino
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("javascript");
            //脚本文件路径
            String path = "E:\eclipse\Rhino\test.js";
            Reader read = null;
            try {
                //通过脚本文件路径构造Reader对象
                read = new FileReader(new File(path));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //执行脚本文件
            engine.eval(read);
        }
    }
    运行结果:
    a+b = 7
  • 相关阅读:
    extjs2.0
    抽象类和接口的选择
    获得汉字字符串的首字母
    快速找回桌面快捷方式
    vs2008破解90天限制
    SQL Server索引的使用和优化
    SQL Server 索引结构及其使用
    桥接模式(Bridge)体验
    vs2008 Working with jQuery
    利用索引来提高速度
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10129518.html
Copyright © 2011-2022 走看看