java引擎组件_Java 脚本引擎入门

Java Script Engine

Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换。

脚本引擎包位于javax.script中,各个类名及描述如下

接口

Bindings

键值对映射,所有key都为String

Compilable

由具体的脚本引擎实现,用于将脚本进行编译,可重复使用。

Invocable 由具体的脚本引擎实现,其允许调用先前已执行的脚本

ScriptContext

脚本引擎上下文,用于将应用程序与脚本引擎进行绑定

ScriptEngine

由具体的脚本引擎实现,定义了执行脚本的方法、键值对映射关系、脚本引擎上下文

ScriptEngineFactory

脚本引擎工厂,每一个ScriptEngine都有一个对应的工厂。ScriptEngineManager会从ClassLoader中获取所有的ScriptEngineFactories实例

AbstractScriptEngine

ScriptEngine的抽象实现类,提供了ScriptEngine的标准实现

CompiledScript

由存储编译结果的类扩展。可以以Java类、Java类文件或者脚本操作码的形式存储,可以重复执行无需重新解析。每个CompiledScript都与一个ScriptEngine相关联,调用CompiledScript的eval方法会导致ScriptEngine执行

ScriptEngineManager

脚本引擎管理器,提供ScriptEngine的实例化机制,并维护了一些键/值对集合,供所有创建的ScriptEngine共享使用

SimpleBindings

使用HashMap 或者其他Map实现的一种简单键值映射

SimpleScriptContext

ScriptContext 的一种简单实现

异常

ScriptException

脚本API的通用异常类,抛出的异常类具有文件名、行号、列号信息

示例

简单的

@Test

public void scriptTest() throws ScriptException {

ScriptEngineManager engineManager = new ScriptEngineManager();

//获取JavaScript解析引擎

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

//将x变量映射为Hello World!

engine.put("x", "Hello World!");

engine.eval("print(x)");

}

//输出

//Hello World!

较复杂的

从文件中读取脚本

/**

* 从文件中读取Js脚本

* test.js 中的内容:

* var obj = new Object();

* obj.hello = function (name) {

* print('Hello, ' + name);

* }

* @throws Exception

*/

@Test

public void file() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

engine.eval(new FileReader(new File("script/test.js")));

Invocable inv = (Invocable) engine;

Object obj = engine.get("obj");

inv.invokeMethod(obj, "hello", "Script Test!" );

}

将Java变量注入脚本中

有可能需要在脚本中使用Java变量

@Test

public void scriptVar() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

File file = new File("F:/test/test.txt");

//将File对象f直接注入到js脚本中并可以作为全局变量使用

engine.put("files", file);

engine.eval("print(files.getPath());print(files.getName());");

}

调用脚本中的方法

使用Invocable 调用已经加载脚本中的方法

@Test

public void scriptTest1() throws ScriptException, NoSuchMethodException {

ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

StringBuilder sb = new StringBuilder();

sb.append("var obj = new Object();");

sb.append("obj.hello = function(name){print('Hello, ' + name);}");

engine.eval(sb.toString());

//Invocable 可以调用已经加载过的脚本

Invocable invocable = (Invocable) engine;

//获取脚本的obj对象

Object object = engine.get("obj");

//调用obj对象的hello函数

invocable.invokeMethod(object, "hello", "Script Method!");

}

//输出

//Hello, Script Method!

多个作用域

一个脚本引擎,多个scope,x变量并没有覆盖之前的变量

@Test

public void scriptTest() throws ScriptException {

ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

engine.put("x", "Hello World!");

engine.eval("print(x)");

ScriptContext context = new SimpleScriptContext();

//新的Script context绑定ScriptContext的ENGINE_SCOPE

Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);

// 增加一个新变量到新的范围 engineScope 中

bindings.put("x", "word hello!!");

// 执行同一个脚本 - 但这次传入一个不同的script context

engine.eval("print(x);", bindings);

engine.eval("print(x);");

}

//输出

//Hello World!

//word hello!!

//Hello World!

使用脚本实现Java接口

@Test

public void runnableImpl() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

// String里定义一段JavaScript代码脚本

String script = "function run() { print('run called'); }";

// 执行这个脚本

engine.eval(script);

// 从脚本引擎中获取Runnable接口对象(实例). 该接口方法由具有相匹配名称的脚本函数实现。

Invocable inv = (Invocable) engine;

// 在上面的脚本中,我们已经实现了Runnable接口的run()方法

Runnable runnable = inv.getInterface(Runnable.class);

// 启动一个线程运行上面的实现了runnable接口的script脚本

Thread thread = new Thread(runnable);

thread.start();

Thread.sleep(1000);

}

如果脚本是基于对象的,则可以通过执行脚本的方法来实现Java接口,避免调用脚本的全局函数。

@Test

public void runnableObject() throws ScriptException {

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

String script = "var obj = new Object();obj.run = function() {println('run method called')}";

engine.eval(script);

//获得脚本对象

Object object = engine.get("obj");

Invocable invocable = (Invocable) engine;

Runnable runnable = invocable.getInterface(object, Runnable.class);

Thread thread = new Thread(runnable);

thread.start();

Thread.sleep(1000);

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 角度传感器模拟_python树莓派红外反射传感器

本文实例为大家分享了python树莓派红外反射传感器的程序,供大家参考,具体内容如下1、工具rpi3,微雪ARPI600,Infrared Reflective Sensor2、基本原理Infrared Reflective Sensor 输出数字和模拟信号模拟信号通过ARPI600上的AD转换芯…

JAVA awt eventqueue_线程“AWT-EventQueue-1”中的异常java.lang.NullPointerException

嗨,我收到错误Exception in thread "AWT-EventQueue-1" java.lang.NullPointerExceptionat P6.itemStateChanged(P6.java:215)at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:2023)at javax.swing.AbstractButton$Handler.item…

java构造方法赋值内存图_java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念...

1.构造器(或构造方法):Constructor构造器的作用:* 1.创建对象* 2.初始化对象的信息2.使用说明:* 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器* 2.定义构造器的格式:权限修饰符 类名(形参列表){}…

java 集合modcount_源码|jdk源码之LinkedList与modCount字段

链表是对上一篇博文所说的顺序表的一种实现。与ArrayList思路截然不同,链表的实现思路是:不同元素实际上是存储在离散的内存空间中的。每一个元素都有一个指针指向下一个元素,这样整个离散的空间就被“串”成了一个有顺序的表。从链表的概念来…

idea 新建ssm java ee_IDEA搭建SSM项目实现增删改查

首先打开IDEA,File—>New—>Project创建项目选择左侧导航栏里的Maven,勾上勾,选择webapp按如下图进行填写创建完成后进入项目,右下角弹出的提示点击右边的Enable Auto-Import,自动配置连接数据库,我用…

php mail centos_centos怎么发送邮件

一、安装sendmail与mail1、安装sendmail:1) centos下可以安装命令:yum -y install sendmail2) 安装完后启动sendmail命令:service sendmail start2、安装mail安装命令:yum install -y mailx二、发送邮件1、通过文件内容发送发送命…

php文件的作用,php入口文件的作用-PHP问题

php入口文件的作用php入口文件能够完成主动加载性能。解析PHP入口文件的主动加载性能php的主动加载:正在php5之前,咱们要用某个类或类的办法,那必需include或许require,之后能力应用,每一次用一个类,都需求…

emacs php 配置文件,如何配置emacs进行正确的PHP开发?

我使用web模式(http://web-mode.org/)混合HTML / PHP文件和php模式为纯PHP文件.最新版本的php-mode还推荐使用混合HTML / PHP文件的Web模式:https://github.com/ejmr/php-mode#avoid-html-template-compatibility.不同于其他模式,如mmm模式,mumamo或多网络模式,尝试…

php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解

这个新的修复方法初衷是好的, 但是却带来一个严重的问题(5.3.10中已经修复), 这个问题最初是由Stefan Esser发现的. 请看之前(5.3.9)最终的修复方案(php_register_variable_ex):代码如下while (1) {if (zend_symtable_find(symtable1, escaped_index, index_len 1, (void **) …

java中随机数边界问题,java 简单Dice问题(随机数的运用)

[java]代码库/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

php 正则替换 ubb,php实现过滤UBB代码的类

本文实例讲述了php实现过滤UBB代码的类。分享给大家供大家参考。具体如下:PHP代码如下:class Day{function ubb($Text) { /// UBB代码转换//$Texthtmlspecialchars($Text);//$Textereg_replace("\r\n","",$Text);$Textereg_rep…

java单词测试,java单词 - 在线打字测试(dazi.kukuw.com)

java单词贡献者:15533470608类别:英文 时间:2018-08-04 22:32:16 收藏数:20 评分:0返回上页举报此文章请选择举报理由:广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的文章改错字public static…

java vector list,Java基础之:List——ArrayList Vector

Java基础之:List——ArrayList & VectorArrayList简单介绍ArrayList实现了List接口,底层是一个数组,并实现了可变的功能。底层属性(transient Object[] elementData;)在序列化时,忽略该属性。ArrayList实现了List接口&#xf…

java建立线性表的链式结构,数据结构学习----线性表的链式表示(Java实现)

线性表接口LList:package com.clarck.datastructure.linked;/*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数据元素的数据类型** author clarck**/public interface LList {/*** 判断线性表是否空* return*/boolean isEmpty();…

php prepare 批量,PreparedStatement批处理

PreparedStatement批量更新关键代码 无 import java.sql.Connection;import java.sql.PreparedStatement; //...String sql "insert into employee (name, city, phone) values (?, ?, ?)";Connection connection new getConnection();PreparedStatement pPrepa…

钉钉 php 推送,微信模板推送,钉钉信息推送

上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案&#xf…

java repaint 重画图形,学习笔记:WINDOWS的图形重绘基础

OnPaint()与OnDraw()的区别:OnPaint是WM_PAINT的消息响应函数,在MFC的基类里OnPaint函数调用了OnDraw()函数。OnPaint函数另外还调用了OnPrepareDC()函数。如果在窗口子类覆盖了OnPaint函数,当MFC调用我们重写的OnPaint函数时,就调…

php定义数据表类,phpwind中的数据库操作类

phpwind中的数据库操作类2021-01-22 20:12:15141/*来源:phpwind.net*/ClassDB{var$query_num0;functionDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect0){$this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect);}functionconnect($dbhost,$dbuser,$dbpw,$dbnam…

涡轮机叶片matlab强度分析论文,一种基于MATLAB及Pro_E的涡轮建模方法

自动化与控制与二一种基于MATLAB及Pro/E的涡轮建模方法王智明(中海油服油田技术事业部北京1011&am…

基于matlab的传热学虚拟实验开发,基于MATLAB的传热学课程虚拟实验软件的开发

215教育现代化2018 年 12 月第 49 期 教育信息技术 基于 MATLAB 的传热学课程虚拟实验软件的开发 周永利,李友荣,石万元,张力元,杨晨,卞煜,王国强,李俊,包键 ( 重庆大学 低品位能源利…