00-JAVA基础-脚本引擎

JAVA脚本引擎

什么是JAVA脚本引擎

Java 平台自带了如JavaScript、Groovy等脚本语言的引擎,可以在运行时动态地加载和执行脚本代码。这些脚本引擎可以直接在Java应用程序中使用,例如,通过ScriptEngineManager来获取特定脚本语言的ScriptEngine实例,然后使用eval()方法执行脚本代码。

Java 脚本引擎使得Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的。Java 脚本API是连通Java平台和脚本语言的桥梁,可以把一些复杂异变的业务逻辑交给脚本语言处理,这大大提高了开发效率。

自JDK1.6开始,Java引入了脚本引擎的功能,并基于Rhino引擎实现。而在JDK1.8之后,Java开始使用Nashorn引擎,它支持ECMAScript 5标准,在JDK 11及以后是GraalVM的JavaScript实现。需要注意的是,这些技术细节可能会随着Java版本的更新而发生变化。

除此之外,还有像JRuby和Jython这样的工具,它们分别是Ruby和Python语言的Java实现,允许在Java应用程序中运行对应的脚本语言,实现与Java的无缝集成和互操作性。

脚本引擎对象获取

创建ScriptEngineManager实例

package demo1;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**
 * Java 脚本引擎及简单使用
 *
 * @author Anna.
 * @date 2024/4/4 15:37
 */
public class ScriptEngineDemo {
    public static void main(String[] args) throws Exception {
        // 创建ScriptEngineManager实例
        ScriptEngineManager manager = new ScriptEngineManager();
        // 通过ScriptEngineManager获取特定的脚本引擎。调用getEngineByName传入需要使用的脚本引擎名称(比如JavaScript)即可
        ScriptEngine engineByName = manager.getEngineByName("JavaScript");

        // 使用ScriptEngine执行脚本。一旦你有了ScriptEngine的实例,你可以使用eval方法来执行脚本
        Object evalRtn = engineByName.eval("'1' + 20");
        System.out.println(evalRtn);
    }
}

执行结果

在这里插入图片描述

如果你不确定系统中哪些脚本引擎是可用的,可以通过ScriptEngineManager的getEngineFactories方法来获取所有可用的脚本引擎工厂,进而了解可用的脚本引擎类型。

package demo1;

import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;

/**
 * 查看系统中可用的所有脚本引擎的信息
 *
 * @author Anna.
 * @date 2024/4/4 15:37
 */
public class ScriptEngineDemo2 {
    public static void main(String[] args) throws Exception {
        // 创建ScriptEngineManager实例
        ScriptEngineManager manager = new ScriptEngineManager();
        // 获取所有可用的脚本引擎工厂
        for (ScriptEngineFactory factory : manager.getEngineFactories()) {
            System.out.println("ScriptEngineFactory Info:");
            System.out.println("  Script Engine Name: " + factory.getEngineName());
            System.out.println("  Script Engine Version: " + factory.getEngineVersion());
            System.out.println("  Script Engine Language: " + factory.getLanguageName());
            System.out.println("  Script Engine Language Version: " + factory.getLanguageVersion());
            System.out.println("  Names: " + factory.getNames());
            System.out.println("  Mime Types: " + factory.getMimeTypes());
            System.out.println("  Extensions: " + factory.getExtensions());
        }
    }
}

执行结果

在这里插入图片描述

常用API

Java 脚本引擎提供了丰富的API,使得开发者能够灵活地执行和管理脚本。
JDK1.6开始,Java引入了脚本引擎的功能,并基于Rhino引擎实现。而在JDK1.8之后,Java开始使用Nashorn引擎,它支持ECMAScript 5标准,在JDK 11及以后是GraalVM的JavaScript实现。
不同版本相应方法可能有所差异,因此建议查阅相应文档以获取最准确的信息和示例代码
以下是Java8脚本引擎中一些常用的API及其描述:

类型方法描述
ScriptEngineManager-ScriptEngineManager类用于管理脚本引擎。它是获取脚本引擎实例的工厂类。
-getEngineByName(String name)根据指定的脚本语言名称获取脚本引擎。
-getEngineFactories()获取所有可用的脚本引擎工厂。
ScriptEngineScriptEngine-接口定义了执行脚本的基本方法。
-eval(String script)执行传入的脚本字符串,并返回脚本的结果。
-put(String key, Object value)将Java对象绑定到脚本引擎的上下文中,以便在脚本中使用。
-get(String key)从脚本引擎的上下文中获取绑定的Java对象。
Invocable -如果脚本引擎支持Java反射API,那么它的ScriptEngine实例也会实现Invocable接口。
-invokeFunction(String name, Object… args)调用脚本中定义的函数。
-getMethod(String name, Class<?>… parameterTypes)获取脚本中定义的函数或方法的Method对象。
BindingsBindings-接口表示存储键值对的集合,用于在脚本和Java之间共享数据。
-put(String name, Object value)将键值对添加到绑定中。
-get(Object key)从绑定中获取与键关联的值。
ScriptContext-ScriptContext接口表示脚本引擎的上下文,用于管理脚本引擎的输入、输出和错误流,以及引擎的绑定。
-getEngineScope()获取与脚本引擎相关的绑定。
-setWriter(Writer writer)设置脚本引擎的输出流。
-setErrorWriter(Writer writer)设置脚本引擎的错误流。

测试案例

package demo2;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.List;
import java.util.function.Consumer;

/**
 * 脚本引擎使用测试案例
 *
 * @author Anna.
 * @date 2024/4/4 15:53
 */
public class ScriptEngineDemo {
    public static void main(String[] args) throws Exception {
        // 创建脚本引擎管理对象
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        // 获取js脚本引擎对象
        ScriptEngine jsEngine = scriptEngineManager.getEngineByName("js");

        // 通过Jjava方法定义变量,存储到引擎上下文中
        jsEngine.put("name", "张三");
        // 通过执行脚本定义
        jsEngine.eval("var age = 30;");

        // 输出上下文中变量的值
        System.out.printf("输出两种方式定义变量,引擎上限文中的值:name=%s,age=%s%n", jsEngine.get("name"), jsEngine.get("age"));

        // 通过脚本定义函数
        jsEngine.eval("function add(a,b){return a + b;}");

        // 执行函数
        Invocable jsInvocable = (Invocable) jsEngine;
        Object addRtn = jsInvocable.invokeFunction("add", 30, 20);
        System.out.printf("输出调用脚本定义函数结果值:%s%n", addRtn);

        // 脚本引擎中导入java包
        String jsCode = "var list = Java.type('java.util.Arrays').asList(\"张三\",\"李四\");";
        jsEngine.eval(jsCode);

        // 获取js中通过java类中方法定义的变量,并输出
        List<String> list = (List<String>) jsEngine.get("list");
        for (String item : list) {
            System.out.println(item);
        }
    }

    /**
     * 定义打印的方法
     *
     * @param str
     * @param consumer
     * @return void
     * @author Anna.
     * @date 2024/4/4 16:38
     */
    public static void print(String str, Consumer<String> consumer) {
        consumer.accept(str);
    }
}

执行结果

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha&#xff0c;在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中&#xff0c;搜索movie render &#xff0c;加载movie render q…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

Vuex的模块化管理

1&#xff1a;定义一个单独的模块。由于mutation的第二个参数只能提交一个对象&#xff0c;所以这里的ThisLog是个json串。 2&#xff1a;在Vuex中的Store.js中引入该模块 3&#xff1a;在别的组件中通过...mapState调用模块保存的State的值。 4&#xff1a;用...mapMutations修…

界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件

Telerik & Kendo UI 2024 Q1 版本于2024年初发布&#xff0c;在此版本中将AI集成到了UI组件中&#xff0c;在整个产品组合中引入AI Prompt组件以及10多个新的UI控件、支持Angular 17、多个数据可视化功能增强等。 P.S&#xff1a;Kendo UI for jQuery提供了在短时间内构建…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

文字超出收起展开功能的实现(vue2)

1.编写展开收起组件 <template><div class"text-clamp"><div class"text" :style"{height}"><span v-if"isVisible" class"btn" click"toggle">{{isExpand ? 收起 : ... 展开}}</spa…

24-Web服务核心功能有哪些,如何实现?

在Go项目开发中&#xff0c;绝大部分情况下&#xff0c;我们是在写能提供某种功能的后端服务&#xff0c;这些功能以RPC API 接口或者RESTful API接口的形式对外提供&#xff0c;能提供这两种API接口的服务也统称为Web服务。 Web服务的核心功能 将这些功能分成了基础功能和高…

day63 单调栈part02

503. 下一个更大元素 II 中等 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

Servlet 的基本理解

Servlet 是JavaEE规范的一种&#xff0c;主要是为了扩展Java作为Web服务的功能&#xff0c;统一接口。由其他内部厂商如tomcat&#xff0c;jetty内部实现web的功能。如一个http请求到来&#xff1a;容器将请求封装为servlet中的HttpServletRequest对象&#xff0c;调用init()&a…

【PduR路由】IPduM模块详细介绍

目录 1.IpduM功能简介 2.IpduM模块依赖的其他模块 2.1RTE (BSW Scheduler) 2.2PDU Router 2.3COM 3.IpduM功能详解 3.1 功能概述 3.2 I-PDU多路复用I-PDU Multiplexing 3.2.1 Definitions and Layout 3.2.2通用功能描述 General 3.2.3模块初始化 Initialization 3.…

安装Docker(CentOS)

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上…

Kubernetes资源ConfigMap

一、ConfigMap的基本概念 1、什么是configMap ConfigMap资源主要为容器注入相关的程序配置信息,用来定制程序的运行方式,比如Redis监听端口、最大客户端连接数。 当定义好一个ConfiqMap资源后,如果Pod需要使用,可以通过通过环境变量、或存储卷的形式将其挂载并加载相关的…

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:C…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…