• Java之戳中痛点


    脚本语言的3大特征:

    1、灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型;
    2、便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务
    3、简单:脚本语言语法比较简单,易学

    另外:java6以上默认支持JavaScript

    Java SE6加入了对JSR223的实现, JSR223旨在定义一个统一的规范,使得java应用程序可以通过一套固定的接口定义与各个脚本引擎交互,从而达到java平台上调用各个脚本语言的目的。

    接口定义在javax.script下面。从而使java语言可以执行javascript,ruby,python等动态语言。

    其中javascript的解析引擎是使用Mozilla Rhino不过是经过修改的。Mozilla Rhino是一个开源的java实现javascript的项目,jdk6中引入了Rhino1.6R2 版本,有了java对javascript的实现,对于java开发人员来说是一个非常便利事情。 下面将介绍如何在java代码中使用javascript。相关的实现在javax.script 包下面。

    定义了 Invocable 、ScriptEngine 、ScriptEngineFactory 、Bindings 、ScriptContext 这5个主要接口。

    例子:

    package com.test;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    import javax.script.Bindings;
    import javax.script.Invocable;
    import javax.script.ScriptContext;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    /**
     * java执行脚本语言
     * @author jd
     *
     */
    public class javascript {
    
        public static void main(String[] args){
    
            //获取一个JavaScript执行引擎
            ScriptEngine se = new ScriptEngineManager().getEngineByName("javascript");
            
            //声明上下文 变量
            Bindings bind  = se.createBindings();
            bind.put("variable","结果:");
            //变量的作用域,当前引擎范围内(常量ScriptContext.ENGINE_SCOPE表示的作用域对应的是当前的脚本引擎,而ScriptContext.GLOBAL_SCOPE表示的作用域对应的是从同一引擎工厂中创建出来的所有脚本引擎对象。前者的优先级较高。)
            se.setBindings(bind,ScriptContext.ENGINE_SCOPE);
            
            try {
                //执行js代码
                se.eval(new FileReader("E:/model.js"));
                
                //是否可调用方法
                if(se instanceof Invocable){
                    Invocable in = (Invocable) se;
                    //执行js的方法
                    String result = (String) in.invokeFunction("formula",2,10);
                    System.out.println(result);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (ScriptException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
                
        }
    
    }

    情景1:

    function formula(a,b){
      return variable+ (a*b);
    }

    结果:

    结果:20

    情景2:

    function formula(a,b){
      return variable+ (a+b);
    }

    结果:12

    情景...

    所以在变更业务时,不需要重启 java服务器,就可顺利变更业务,对于变更频繁的业务,这就是很好的解决方案。

    PS:Java 6 不仅仅提供代码级的脚本内置,还提供了jrunscript命令工具,它可以在批处理中发挥巨大的效能,而且不需要通过JVM解释脚本语言,可直接通过该工具运行脚本;

  • 相关阅读:
    hadoop安全模式
    建造者模式:设计角度重温游戏中的角色
    工厂模式:工厂方法与抽象工厂的战争
    原型模式(克隆模式):浅谈浅克隆与深克隆
    单例模式:层层剖析寻找最高效安全的单例
    24种设计模式和7大设计原则
    浅谈图的存储结构与遍历
    彻底理清二叉排序树的插入、查找、删除
    浅谈顺序、折半查找
    Android定位(是否使用GPS进行定位)
  • 原文地址:https://www.cnblogs.com/JsonShare/p/6377879.html
Copyright © 2020-2023  润新知