8.4(Java学习笔记)java脚本引擎(Rhino)
一、java脚本引擎
java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的脚本引擎在java中调用各种脚本语言。
二、脚本引擎执行脚本代码
ScriptEngineManager:为ScriptEngine提供实例化机制。
方法:getEngineByName(String shortName);//查找并创建指定名称的脚本引擎
ScriptEngine:是一个接口,该接口提供了基本的脚本功能(包括执行脚本,设置和获取值的方法)。
方法:get(String key);//获取指定key所对应的值,这里的key看做变量名称,值看做变量名所对应的值。
eval(String script);//执行指定的脚本代码
eval(Reader reader);//执行指定的脚本文件
java执行JavaScript脚本步骤:
1.获取脚本引擎
2.指定脚本名称
3.编写脚本语句
4.执行脚本
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class TestRhino {
public static void main(String[] args) throws ScriptException {
//获取脚本引擎,并指定脚本语言
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
//定义上下文变量,被脚本和java共享
engine.put("msg", "javascript");
//定义脚本代码
String str = "var user = {name:'hcf',age:19,sex:'man'};";
str+="print(user.name);";
//执行脚本
engine.eval(str);
System.out.println("修改前的内容:"+engine.get("msg"));
engine.eval("msg ='java';");//修改msg内容
System.out.println("修改后的内容:"+engine.get("msg")); }
}
运行结果:
hcf
修改前的内容javascript
修改后的内容java
三、脚本引擎执行脚本方法
1.执行脚本方法,首先肯定是要在脚本中定义方法,然后执行。
2.执行时需要将engine转换为Invcable,然后调用其中的invokeFun
Invocable:由ScriptEngines实现的可选接口,其方法允许调用先前已执行的脚本中的程序(方法)。
3.调用Object invokeFunction(String name, Object... args);执行指定方法。
name为方法名称,args为方法参数,返回是一个Object对象
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class TestRhino {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
//定义方法的字符串形式
String funAdd = "function add(a,b){"
+ " var sum = a + b;"
+ " return sum;"
+ " }";
engine.eval(funAdd);//这一步可以看做将方法写入脚本
Invocable invo = (Invocable)engine;//转换成Invocable
Object result = null;
try {
//执行脚本中方法
result = invo.invokeFunction("add",new Object[]{17,23});
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(result);
}
}
运行结果:
40.0
四、脚本引擎执行脚本文件
1、执行脚本文件,首先我们要指定文件的路径。
2、通过这个路径构建一个Reader对象
3、调用eval(Reader reader);//执行指定的脚本文件
脚本文件内容
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader; import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class TestRhino {
public static void main(String[] args) throws ScriptException {
//E:\eclipse\Rhino
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
//脚本文件路径
String path = "E:\\eclipse\\Rhino\\test.js";
Reader read = null;
try {
//通过脚本文件路径构造Reader对象
read = new FileReader(new File(path));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//执行脚本文件
engine.eval(read);
}
}
运行结果:
a+b = 7
8.4(Java学习笔记)java脚本引擎(Rhino)的更多相关文章
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- 我的Java学习笔记-Java面向对象
今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...
- java学习笔记----java入门
java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...
- Java学习笔记-Java概述和环境配置
基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...
- Java学习笔记-Java中的常用类
Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...
- Java 学习笔记---Java double类型相加问题
多个double类型的数直接相加的时候,可能存在精度误差.( 由于计算机算法以及硬件环境决定只能识别 0 1.计算机默认的计算结果在都在一个指定精度范围之内,想往深的了解,可以学习数值分析等) 在金融 ...
- Java学习笔记——java基础
2020.9.1 学习来自 https://www.liaoxuefeng.com/wiki/1252599548343744/1255883729079552 一.变量和数据类型 基本数据类型 基本 ...
随机推荐
- HDU 1698 Just a Hook(线段树
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- saltstack入门至放弃之salt安装部署
学习了一段时间的saltstack,是时候记录下了.友提:学习环境是两台centos_7.2_x64机器 系统初始化: 两台机器执行以下脚本即可(友提:两台服务器的主机名配置在/etc/hosts中, ...
- MDIO/MDC(SMI)接口-leonwang202
ChinaUnix博客 http://blog.chinaunix.net/uid-24148050-id-132863.html
- 网络流专题练习Day2
04/17 目前做了:题 由于目前六道都是1A感觉非常爽... BZOJ1412: [ZJOI2009]狼和羊的故事 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向 ...
- 【BZOJ】1782: [Usaco2010 Feb]slowdown 慢慢游
[算法]DFS序+树状数组 [题解]题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和. 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[ ...
- opencv_人脸检测、模型训练、人脸识别
人脸检测.模型训练.人脸识别 2018-08-15 今天给大家带来一套人脸识别一个小案例,主要是帮助小伙伴们解决如何入门OpenCV人脸识别的问题,现在的AI行业比较火热,AI技术的使用比较广泛.就拿 ...
- python3 基础概念
一.3.x新特性 1.print (),打印,3.x必须加括号 2.raw_input,3.x改为input 二.简介 Python是著名的“龟叔”Guido van Rossum在1989年 ...
- GCC编译安装
1. 安装静态库,如果没有安装静态库,后面编译不会通过: yum install glibc-static libstdc++-static -y 2. 下载GCCxxx.tat.gz: wget h ...
- UVALIVE 3486 Cells
通过入栈出栈顺序判断祖先关系 这里UVALIVE还 #include <map> #include <set> #include <list> #include & ...
- 修改ueditor CSS