Java学习笔记--脚本语言支持API
分类:澳门威斯尼人平台

Java语言的动态性之脚本语言帮助API

Java学习笔记--脚本语言支持API。       随着Java平台的风靡,相当多的脚本语言(scripting language)都足以运维在Java虚拟机啊上,当中比较盛行的有JavaScript、JRuby、Jython和Groovy等。相对Java语言来讲,脚本语言由于其灵活性非常强,特别相符在好几境况下选取,譬喻描述应用中复杂多变的业务逻辑,并在运用运营进度中开展动态修改;为运用提供一种世界特定语言(Domainspecific Language,DSL),供未有才干背景的普通客户使用;作为利用中逐一零部件之间的“胶水”,快捷张开零部件之间的咬合;快捷支付出利用的原型系统,进而迅速猎取客户举报,并展开革新;帮衬开垦职员快捷编写测量检验用例等。等于那些场景,假若使用java来支付则事倍功半。

       对于这一个运转在Java虚构机平台上的脚本语言来讲,并没有需求为他们筹划额外的运作条件,直接复用已部分Java虚构机境况就可以。这就节约了在运维遇到上所需的费用投入。在行使开采中央银行使脚本语言,实际上是“多语言开采”的一种很好的施行,即基于使用的急需和言语本人的特色来挑选最合适的成为语言,以快捷高效地消除接纳中的某一片段标题。三种不一致语言实现的组件组合起来,用Java编写宗旨业务逻辑,用Ruby来进展数量管理。差异语言编写的代码能够同一时间运营的同四个Java设想机之上。那个脚本语言和Java语言之间的相互,是由脚本语言扶助API来完结的。

1.脚本引擎

Java学习笔记--脚本语言支持API。       一段脚本的实施必要由该脚本语言对应的本子引擎来成功。三个Java程序可以采用同一时候满含各个脚本语言的施行引擎,那全然由程序的必要来支配。程序中所用到的脚本语言,都急需有料理的脚本引擎。JS索罗德233中定义了本子引擎的挂号和搜索体制。那对于脚本引擎的完结者来讲,是索要领会的。而貌似的开拓人士只需求精通怎么样通过脚本引擎管理器来收获相应语言的本子引擎,并没有须要了然脚本引擎的注册机制。Java SE6中自带了JavaScript语言的台本引擎,是基于Mozilla的Rhino来完结的。对于另外的脚本语言,则必要下载对应的脚本引擎的库并放在程序的类路线中。平日只要放在类路线中中,脚本引擎就能够被应用程序开采并行使。
        首先介绍脚本引擎的相似用法。首先创设二个本子引擎管理器javax.script.ScriptEngineManager对象,再通过管理器来查询所需的JavaScript脚本引擎,最终经过脚本引擎来实施JavaScript代码。

ScriptEngineManagerDemo

图片 1

施行结果

图片 2

       下边包车型大巴代码中是透过脚本引擎的名字进行检索的。实际上,脚本引擎处理共辅助两种检索脚本引擎的办法,分别通过名称、文件扩充名和MIME类型来造成。

2.语言绑定

       脚本语言帮衬API的一个极大优势在于它规范了Java语言与脚本语言之间的交互格局,使Java语言编写的前后相继能够与剧本之间展开双向的格局调用和数码传递。方法调用的方法会在稍后介绍。数据传递是经过言语绑定对象来成功的。所谓的绑定对象正是八个轻松的哈希表,用来寄放在和获得需求分享的多寡。全部数据都对应以此哈希表中的一个条约,是大概的名值对。接口javax.script.Bindings定义了言语绑定对象的接口,承接自java.util.Map接口。三个剧本引擎在进行进程中大概会使用三个语言绑定对象。不一致语言绑定对象的功能域不一样。在暗许情形下,脚本引擎会提供五个语言绑定对象,用来存放在在实行进程中发出全局对象等。ScriptEngine类提供了put和get方法对台本引擎中一定功能域的暗许语言绑定对象实行操作。程序能够向来利用这些暗中同意的言语绑定对象,也足以利用自身的语言绑定对象。在脚本语言的实行进度中,能够将语言绑定对象看成是一个外加的变量映射表。在剖判变量值的时候,语言绑定对象中的名称也会被考虑在内。脚本实施进程中发出的全局变量等剧情,会出现在言语绑定对象中。通过这种艺术就完成了Java与脚本语言之间的双向数据传递。

剧本引擎私下认可的言语绑定对象的亲自去做

    /**
    * 脚本引擎默认的语言绑定对象的示例
     */
    public static void useDefaultBinding(){
        try{
            ScriptEngine  engine = getJavaScriptEngine();
            engine.put("name","Arthur");
            engine.eval("var message = 'Hello,' + name;");
            engine.eval("print(message);");
            Object obj = engine.get("message");
            System.out.println(obj);
        }catch (Exception e){
            System.out.println("异常信息:"+e.getMessage());
        }
    }

Java学习笔记--脚本语言支持API。本子引擎私下认可的言语绑定对象的示范施行结果

图片 3

Java学习笔记--脚本语言支持API。    在大多数景色下,使用ScriptEngine的put和get方法就充足了。假如仅使用put和get方法,语言绑定对象自己对于开拓人士来讲是晶莹的。在一些情状下,需求选拔程序自个儿的语言绑定对象,比方语言绑定对象中包蕴了先后本身独有的数额。即使期待利用自个儿的语言绑定对象,能够调用脚本引擎的createBindings方法或成立,并传递给脚本引擎的eval方法。

自定义语言绑定对象的亲自过问

    /**
     * 自定义语言绑定对象的示例
     */
    public static void userCustomBinding(){
        try{
            ScriptEngine engine = getJavaScriptEngine();
            Bindings bindings = new SimpleBindings();
            bindings.put("hobby","playe games");
            engine.eval("print('I like ' + hobby);",bindings);
        }catch(Exception e){
            System.out.println("异常信息:"+e.getMessage());
        }
    }

自定义语言绑定对象的示范的实行结果

图片 4

    通过eval方法传递的语绑定对象,仅在脚下eval调用中生效,并不会转移引擎暗中同意的言语绑定对象。

3.脚本实行上下文

    与剧本引擎试行有关的别的贰个最重要的接口是javax.script.ScriptContext,个中积累脚本引擎推行进度的连锁上下文消息,可以因而与Java EE中servlet规范中的javax.servlet.ServletContext接口来进展类比。脚本引擎通过此上下文对象获得与剧本执行有关的新闻,也允许开采人士通过此指标来配置脚本引擎的一坐一起。该上下文对象首要富含以下3类消息:

3.1输入与出口

    首先介绍与脚本输入和输出的安顿音讯,在那之中囊括脚本在施行中用来读取数据输入的java.io.Reader对象以至出口准确内容和失误音信的java.io.Writer对象。在默许景况下,脚本的输入输出都在发出在标准调控台北。

把脚本运转时的出口写入到文件中的示例

    /**
     * 把脚本运行时的输出写入到文件中。
     */
    public static void scriptToFile(){
        try {
            ScriptEngine engine = getJavaScriptEngine();
            ScriptContext context = engine.getContext();
            context.setWriter(new FileWriter("output.txt"));
            engine.eval("print('Hello World!');");
        } catch (ScriptException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

进行结果

图片 5

说明
    通过setWriter方法把剧本的出口重定向到五个文书中。通过ScriptContext的setReader和setErrorWriter方法能够独家设置脚本实践时的数据输入来源和发生错误时出错信息的输出指标。

3.2自定义属性

    ScriptContext中也可能有与ServletConext中好像的收获和设置属性的艺术,即setAttribute和getAttribute。所例外的是,ScriptContext中的属性是有功能域之分的。分裂成效域的分化在于寻找属性时的次第分歧。每一个功效域都是壹个对应的整数表示其找出顺序。该整数值越小,表明查找时的逐个越优先。优先级高的成效域中的属性会暗藏优先级低的效率域中的同名属性。因而,设置属性时要求显式地钦定所在地成效域。在获得属性地时候,不仅可以够选用在钦定地功能域中搜索,也足以选用依据成效域优先级活动进行搜寻。
    然则脚本推行上下文达成中包涵地成效域是恒久的,开拓职员不能够轻巧定义自个儿的功用域。通过ScriptContext的getScopes方法可以得到全体可用的功能域列表。ScriptContext中先行定义了七个功能域:

  • 常量ScriptContext.ENGINE_SCOPE代表的成效域对应的是这段时间的本子引擎。
  • 常量ScriptContext.GLOBAL_SCOPE表示的成效域对应的是从同一引擎工厂中创制出来的具备脚本引擎对象。

    说明: 前端的前期级较高

#### 作用域影响同名属性查找示例

       /**
     * 作用域影响同名属性查找的示例
     */
    public static void scriptContextAttribute(){
        try{
            ScriptEngine engine = getJavaScriptEngine();
            ScriptContext context = engine.getContext();
            context.setAttribute("name","Arthur Ming",ScriptContext.GLOBAL_SCOPE);
            context.setAttribute("name","明国宾",ScriptContext.ENGINE_SCOPE);
            System.out.println(context.getAttribute("name"));
            System.out.println(context.getAttribute("name",ScriptContext.GLOBAL_SCOPE));
        } catch(Exception e){
            System.out.println("异常信息:"+e.getMessage());
        }
    }

#### 执行结果

![](https://images2015.cnblogs.com/blog/1001991/201703/1001991-20170326223034830-213077996.png)

3.1语言绑定对象

    脚本实践上下文中的最终一类新闻是言语绑定对象。语言绑定对象也是与效果域相对应的,同样的功用域优先级依次对语言绑定对象也适用。那样的预先级依次会对剧本推行时的变量分析产生潜移暗化。

言语绑定对象的预先级依次的示范

    /**
     * 语言绑定对象的优先级顺序的示例
     */
    public static void scriptContextBindings(){
        try {
            ScriptEngine engine = getJavaScriptEngine();
            ScriptContext context = engine.getContext();
            Bindings binding1 = engine.createBindings();
            binding1.put("name","Arthur Ming");
            context.setBindings(binding1,ScriptContext.GLOBAL_SCOPE);
            Bindings binding2 = engine.createBindings();
            binding2.put("name","明国宾");
            context.setBindings(binding2,ScriptContext.ENGINE_SCOPE);
            engine.eval("print(name)");
        } catch (Exception e){
            e.printStackTrace();
        }
    }

施行结果

图片 6

    通过ScriptContext的setBindings方法设置的言语绑定对象会影响到ScriptEngine在推行脚本时变量解析。ScriptEngine的put和get方法所操作的实际上正是ScriptContext中的功用域为ENGINE_SCOPE的语言绑定对象。

通过脚本实行上下文获取语言绑定对象的身体力行

   /**
     * 通过脚本执行上下文获取语言绑定对象的示例
     */
    public static void useScriptContextValues(){
        try{
            ScriptEngine engine = getJavaScriptEngine();
            ScriptContext context = engine.getContext();
            Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
            bindings.put("name","Arthur Ming");
            engine.eval("print(name)");
        } catch (Exception e){
            e.printStackTrace();
        }
    }

施行结果

图片 7

    自定义属性实际上也保留在语言绑定对象中。

自定义属性保存在语言绑定对象中示范

    /**
     * 自定义属性保存在语言绑定对象中示例
     */
    public static void attributeInBindings(){
        try{
            ScriptEngine engine = getJavaScriptEngine();
            ScriptContext context = engine.getContext();
            context.setAttribute("name1","Arthur Ming",ScriptContext.GLOBAL_SCOPE);
            context.setAttribute("name2","明国宾",ScriptContext.ENGINE_SCOPE);
            engine.eval("print(name1);");
            engine.eval("print(name2);");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

实行结果

图片 8

本文由澳门威斯尼人平台发布于澳门威斯尼人平台,转载请注明出处:Java学习笔记--脚本语言支持API

上一篇:记一次产品经理客串活动运营的失败经历 下一篇:Android集结号
猜你喜欢
热门排行
精彩图文