当前位置: 首页 > news >正文

Java - JSR223规范解读_在JVM上实现多语言支持

文章目录

  • 1. 概述
  • 2. 核心目标
  • 3. 支持的脚本语言
  • 4. 主要接口
  • 5. 脚本引擎的使用
    • 执行JavaScript脚本
    • 执行groovy脚本
      • 1. Groovy简介
      • 2. Groovy脚本示例
      • 3. 如何在Java中集成 Groovy
      • 4. 集成注意事项
  • 6. 与Java集成
  • 7. 常见应用场景
  • 8. 优缺点
  • 9. 总结

在这里插入图片描述

1. 概述

JSR223(Java Specification Request 223),也称为 Scripting for the Java Platform,是一个Java平台的标准接口,旨在让Java应用程序能够灵活地集成和执行脚本语言。它定义了一种可以在Java应用中嵌入不同脚本语言的统一接口,允许Java程序调用、执行脚本,并且支持将Java对象传递到脚本语言中。


2. 核心目标

JSR223的目标是提供一种标准的API,以便Java应用能够:

  • 动态地执行脚本代码
  • 支持多个脚本语言
  • 将Java应用中的对象传递到脚本环境中

3. 支持的脚本语言

JSR223并没有指定哪些脚本语言必须支持,但它的设计理念是能够支持多种脚本语言。常见的支持脚本语言包括:

  • JavaScript (Nashorn / GraalVM)
  • Groovy
  • JRuby
  • Jython (Python)
  • Lua
  • BeanShell

不同的脚本语言通过JSR223接口进行集成,这些脚本引擎作为JSR223的实现进行交互。


4. 主要接口

JSR223定义了几个关键接口来实现Java与脚本语言的交互:

  • ScriptEngine: 这个接口代表了一个脚本引擎,允许Java代码与具体的脚本语言引擎进行交互。每个脚本引擎都实现了这个接口。
  • ScriptEngineFactory: 用于创建脚本引擎的工厂类。通过这个工厂类,Java程序可以获得可用的脚本引擎实例。
  • Bindings: 用于在Java和脚本之间传递变量和对象。Bindings允许在脚本执行期间使用Java对象。

常见的实现类:

  • Nashorn(从Java 8开始包含,用于执行JavaScript)
  • GraalVM(一个多语言执行环境,支持更多语言的集成)

5. 脚本引擎的使用

脚本引擎是JSR223的核心部分,接下来看几个例子

执行JavaScript脚本

样例一: 使用Nashorn引擎执行JavaScript代码的示例。

package com.artisan.jsr223;
import javax.script.*;public class JSR223Example {public static void main(String[] args) throws ScriptException {// 创建一个脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();// 获取JavaScript引擎ScriptEngine engine = manager.getEngineByName("nashorn");// 执行JavaScript代码engine.eval("print('Hello, JSR223')");// 使用绑定传递变量Bindings bindings = engine.createBindings();bindings.put("name", "Artisan");engine.eval("print('Hello, ' + name);", bindings);}
}

在这个例子中,我们通过 ScriptEngineManager 获取Nashorn引擎,执行简单的JavaScript代码,使用 Bindings 传递变量。

在这里插入图片描述


样例二:

package com.artisan.jsr223;import javax.script.*;public class JSR223Example {public static void main(String[] args) throws Exception {// 获得JavaScript的脚本引擎ScriptEngineManager scriptEngineManager = new ScriptEngineManager();ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");// 进行脚本编译String script = "function process(){\n" +"var a=10;\n" +"var b=3;\n" +"return a*b-c;\n" +"}\n" +"process()";// 检查脚本引擎是否支持编译if (scriptEngine instanceof Compilable) {Compilable compilable = (Compilable) scriptEngine;CompiledScript compiledScript = compilable.compile(script);// 绑定Java的参数Bindings bindings = new SimpleBindings();bindings.put("c", 5);// 执行并打印结果Object result = compiledScript.eval(bindings);System.out.println(result);} else {System.out.println("当前脚本引擎不支持编译功能");}}
}

在这里插入图片描述


执行groovy脚本

1. Groovy简介

Groovy是一个基于Java平台的动态语言,它简洁、表达力强,并且与Java兼容性极高。Groovy可以作为Java的脚本引擎,直接在Java应用中使用。Groovy的语法简洁,支持面向对象、闭包、动态类型等特性,通常用于快速开发和扩展功能。

2. Groovy脚本示例

假设我们要编写一个简单的Groovy脚本,来计算一个人的年龄,并根据年龄判断是否符合某个年龄段(如成年)。

// 定义一个函数来计算年龄
def calculateAge(birthYear) {def currentYear = 2024return currentYear - birthYear
}// 定义一个函数来判断是否成年
def isAdult(age) {return age >= 18
}// 调用计算年龄和判断是否成年
def birthYear = 1990
def age = calculateAge(birthYear)println("Age: ${age}")
if (isAdult(age)) {println("You are an adult.")
} else {println("You are not an adult.")
}

解释:

  • def:用于定义变量或函数,Groovy是一种动态语言,变量和函数不需要显式声明类型。
  • calculateAge:该函数接受一个出生年份,返回计算后的年龄(2024年减去出生年份)。
  • isAdult:根据传入的年龄判断是否成年,成年为18岁及以上。
  • println:Groovy的内建方法,输出结果。

运行结果:

Age: 34
You are an adult.

3. 如何在Java中集成 Groovy

假设我们希望在Java代码中动态执行这个Groovy脚本,可以通过JSR223来实现。以下是如何在Java中嵌入并执行Groovy脚本的示例:


import javax.script.*;public class GroovyTest {public static void main(String[] args) throws ScriptException {// 创建一个脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();// 获取Groovy引擎ScriptEngine engine = manager.getEngineByName("groovy");// 定义Groovy脚本String script ="def calculateAge(birthYear) { " +"    def currentYear = 2024; " +"    return currentYear - birthYear; " +"}\n" +  // 添加换行符"def isAdult(age) { " +"    return age >= 18; " +"}\n" +  // 添加换行符"def birthYear = 1990; " +"def age = calculateAge(birthYear); " +"println('Age: ' + age); " +"if (isAdult(age)) { " +"    println('You are an adult.'); " +"} else { " +"    println('You are not an adult.'); " +"} ";// 执行Groovy脚本engine.eval(script);}
}

步骤:

  1. 使用 ScriptEngineManager 获取Groovy引擎。
  2. 编写Groovy脚本并将其传递给引擎。
  3. 使用 eval() 方法执行脚本,并输出结果。

运行结果:

Age: 34
You are an adult.

4. 集成注意事项

  • Groovy的依赖:如果在Java项目中使用Groovy脚本,需要将Groovy的JAR包(例如 groovy-jsr223-x.y.z.jar)添加到项目的依赖中。

Maven依赖示例:

   <dependency><groupId>org.apache.groovy</groupId><artifactId>groovy-jsr223</artifactId><version>4.0.24</version></dependency>
  • 性能考虑:Groovy作为动态语言,性能可能不如纯Java代码,特别是在大规模或频繁执行的场景中,可能会引入一定的开销。

6. 与Java集成

  • 变量传递:JSR223允许将Java对象传递给脚本语言。通过 Bindings 接口,可以将Java对象存储在脚本的上下文中,脚本语言也能访问这些对象。

  • 动态执行:使用脚本语言可以动态地执行Java代码段,这对于快速开发和修改业务逻辑非常有效。例如,可以通过Java调用Groovy脚本来快速增加一些动态功能而无需重新编译整个应用。


7. 常见应用场景

JSR223可以广泛应用于多个领域:

  • 动态配置和脚本扩展:在Java应用中使用脚本来动态修改行为。例如,可以用Groovy编写自定义的配置文件解析器。
  • 自动化测试:集成脚本语言用于编写自动化测试脚本。
  • Web应用:在Web应用中,使用JSR223集成脚本语言来编写自定义插件或扩展功能。例如,支持JavaScript来扩展服务器端的业务逻辑。
  • 数据处理:在Java应用中使用脚本来处理数据或执行算法。

8. 优缺点

优点:

  • 灵活性:脚本语言的引入使得Java应用能够动态修改行为,增加了灵活性。
  • 简化开发:无需重新编译整个Java应用,可以动态执行脚本。
  • 多语言支持:能够使用多种脚本语言,适应不同开发者的需求。

缺点:

  • 性能问题:执行脚本语言可能比直接执行Java代码慢,尤其是当脚本频繁执行时。
  • 维护性问题:使用脚本时,可能会增加代码的复杂性,特别是当脚本代码没有很好地组织和文档化时。
  • 调试困难:脚本代码的调试相对困难,尤其是当脚本与Java代码紧密集成时。

9. 总结

JSR223提供了一个标准的接口来将脚本语言集成到Java应用中,支持多个脚本引擎和多种脚本语言的调用。它可以极大地提升Java应用的灵活性和扩展性,尤其适用于动态修改应用行为的场景。然而,使用JSR223时也要注意性能和维护性问题。

在这里插入图片描述

http://www.lryc.cn/news/494651.html

相关文章:

  • win10系统部署RAGFLOW+Ollama教程
  • 基于Python制作一个简易UI界面
  • 鲁菜大师程伟华到访金宫川派味业
  • Linux设置jar包开机自启动
  • IoTDB 常见问题 QA 第一期
  • 【linux学习指南】linux捕捉信号
  • git如何快速拉取已经提交的mr进行验证
  • 【阿来来gis规划师工具箱说明书】h07四分标注
  • 【大数据学习 | 面经】HDFS的三副本机制和编码机制
  • lua-cjson 例子
  • java面向对象知识点: 封装,构造,重载
  • go的math/rand随机数生成器
  • JiaJia-CP-1,2,3的WP(2)
  • 3DMAX星空图像生成器插件使用方法详解
  • ROS2 系列学习教程(总目录)
  • [GKCTF 2021]签到
  • Kubernetes——part11 云原生中间件上云部署 Rocketmqkafkazookeeper
  • ip租期到了
  • 鸿蒙系统(harmony)支持Android应用的双框架技术架构分析
  • 面积等效原理
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用
  • 大小写转换
  • 手机镜头组如此突出,考虑恢复以前设计
  • 浅谈人工智能之基于容器云进行图生视频大模型搭建
  • 大型复杂项目管理怎么结合传统与敏捷
  • 家校通小程序实战教程04教师管理
  • UI控件使用说明
  • 树莓派2安装jupyterlab以便更好的编程体验
  • 计算机网络常见面试题总结(上)
  • k8s 亲和性之Affinity