Java对脚本语言的支持

Java 脚本 API

  JDK提供了一套标准接口,方便Java应用与各种脚本引擎的交互。javax.script 包定义了这些接口,即 Java 脚本编程 API。

脚本引擎

  脚本引擎就是脚本解释器,负责运行脚本,获取运行结果。JDK提供了脚本引擎的接口ScriptEngine ,Java 应用程序通过这个接口调用脚本引擎运行脚本程序,并将运行结果返回给虚拟机。

发现和创建脚本引擎

  JDK提供ScriptEngineManager发现和创建脚本引擎,ScriptEngineManager 通过Java的服务发现机制Service Provider发现服务,过程如下:

  1. 首先,ScriptEngineManager 实例在当前 classpath 中搜索所有可见的 Jar 包,查看每个 Jar 包中的 META -INF/services/ 目录下的是否包含 javax.script.ScriptEngineFactory 文件,脚本引擎的开发者会提供在 Jar 包中包含一个 ScriptEngineFactory 接口的实现类,这个文件内容即是这个实现类的完整名字;
  2. ScriptEngineManager 根据这个类名,创建一个 ScriptEngineFactory 接口的实例;
  3. 最后,通过ScriptEngineFactory 实例创建脚本引擎,返回给用户。
    ScriptEngineManager被实例化的时候,服务发现的动作被执行:
    这里写图片描述

发现和创建脚本引擎

  在 javax.script 支持的每个脚本引擎也有各自对应的执行的环境,脚本引擎可以共享同样的环境,也可以有各自不同的上下文。通过脚本运行时的上下文,脚本程序就能自由的和 Java 平台交互。javax.script.ScriptContext 接口和 javax.script.Bindings 接口定义了脚本引擎的上下文。
Bindings: map容器,存储各种属性值;
ScriptContext: 不同scope的Bindings的集合。ScriptContext 接口默认包含了两个级别的 Bindings 实例的引用,分别是全局级别GLOBAL_SCOPE 和引擎级别ENGINE_SCOPE 。全局级别指的是 Bindings 里的属性都是“全局变量”,只要是同一个 ScriptEngineMananger 返回的脚本引擎都可以共享这些属性;对应的,引擎级别的 Bindings 里的属性则是“局部变量”,它们只对同一个引擎实例可见,从而能为不同的引擎设置独特的环境,通过同一个脚本引擎运行的脚本运行时能共享这些属性。
      这里写图片描述

脚本引擎可选接口

Invocable 接口:允许 Java 平台调用脚本程序中的函数或方法。它提供了两个函数 invokeFunction 和 invokeMethod,分别允许 Java 应用程序直接调用脚本中的一个全局性的过程以及对象中的方法,调用后者时,除了指定函数名字和参数外,还需要传入要调用的对象引用。
Compilable 接口:允许 Java 平台编译脚本程序,供多次调用。

脚本引擎带来问题

  1. 安全控制: 如死循环、调用System.exit(0)导致JVM退出;
  2. 资源隔离: CPU、内存等进行限制和隔离;
  3. 性能问题: 对脚本执行时间进行控制,有超时中断机制;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值