本文系转载

原文地址:http://blog.csdn.net/sdyy321/article/details/6959199

由于要用到该技术,所以写了几个测试,直接上代码。

定义外部资源E:/ScriptEngine/test01.js

if(age>=18){
print('Old enough to vote!');
}else{
print('Back to school!');
}

定义外部资源E:/ScriptEngine/test02.js

if(age<25){
riskFactor = 1.5;
}else if(noClaims){
ristFactor = 0.75;
}else{
ristFactor = 1.0;
}

定义外部资源E:/ScriptEngine/test03.js

function Hello(){}
Hello.prototype.sayHello = function(value){
println('hello!'+value);
}
var hello = new Hello();
hello.sayHello('World1');
   //使用脚本引擎运行脚本程序
public static void test01() throws ScriptException{
// 如果调用者可访问线程上下文 ClassLoader,则调用此构造方法的效果与调用 ScriptEngineManager(Thread.currentThread().getContextClassLoader()) 相同
//ScriptEngineManager检索感兴趣的脚本编写的语言的ScriptEngine对象
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");//ScriptEngine用来处理脚本解释和求值
engine.put("age", 26);//赋值脚本环境中所使用的变量
engine.eval("if(age>=18){println('Old enough to vote!');}else{println('Back to school!');}");//解析 JavaScript 脚本,对脚本表达式进行求值
}
   //使用脚本引擎执行外部资源中的脚本
public static void test02() throws FileNotFoundException, ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("age", 26);
engine.eval(new FileReader("E:/ScriptEngine/test01.js"));//对文件或其它外部资源中得脚本表达式进行求值
}
    //使用脚本引擎检索结果
public static void test03() throws FileNotFoundException, ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("age", 26);
engine.put("noClaims", Boolean.TRUE);
Object result = engine.eval(new FileReader("E:/ScriptEngine/test02.js"));//eval()函数返回执行脚本后所返回的值,默认情况下,将返回上次执行的表达式的值
System.out.println(result.toString());
}
    //上下文属性的作用域
public static void test04() throws ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
Bindings globalBindings = manager.getBindings();//属于ScriptEngineManager的全局上下文,每个ScriptEngineManager拥有一个Bindings
globalBindings.put("name", "yangYong");
ScriptEngine engine = manager.getEngineByName("js");
Bindings globalBindings02 = engine.getBindings(ScriptContext.GLOBAL_SCOPE);//每个引擎都共有一个ScriptEngineManager的Bindings
System.out.println("name="+globalBindings02.get("name"));
System.out.println(globalBindings==globalBindings02);
ScriptContext context = engine.getContext();//每个引擎都有自己独立的scriptContext上下文 Bindings engineDefaultBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);//每个引擎的scriptContext中都有个默认属于自己的Bindings
engineDefaultBindings.put("gender", "男");
engine.eval("name2 = name;println(name2);",engineDefaultBindings);
engineDefaultBindings.put("name", "zhangSan");
engine.eval("name2 = name;println(name2);",engineDefaultBindings);
Bindings engineCreatBindings = engine.createBindings();//每个引擎的scriptContext中也可以新建多个属于自己的Bindings
engineCreatBindings.put("gender", "女");
System.out.println(engineDefaultBindings==engineCreatBindings);
System.out.println(engine.getBindings(ScriptContext.ENGINE_SCOPE).get("gender"));
System.out.println(engineCreatBindings.get("gender"));
engine.eval("name2 = name;println(name2);",engineCreatBindings);
}
    //java应用程序与脚本交互
public static void test05() throws FileNotFoundException, ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Bindings bindings = engine.createBindings();//Bindings:KV对映射,用来在Java应用程序和javascript脚本之间交换信息,即上下文
bindings.put("age", 26);
bindings.put("noClaims", Boolean.TRUE);
bindings.put("riskFactor", 1.0);
engine.eval("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}",bindings);//必须绑定bindings执行脚本,否则报变量未定义异常
double risk = (Double) bindings.get("riskFactor");
System.out.println(risk);
}
    //脚本内部访问java资源
public static void test06() throws ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.eval("importPackage(java.util)");//importPackage()函数允许在脚本内部导入java包,即可在脚本中实例化java对象
engine.eval("today = new Date();println(today);");
engine.put("name", "ZhangSan");
engine.eval("name2 = name.toUpperCase();println(name2);");
}
    //重定向脚本输出
public static void test07() throws IOException, ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js"); PipedReader pr = new PipedReader();
PipedWriter pw = new PipedWriter(pr);
//用户可以通过与这个 PrintWriter 连通的 PrintReader 读取实际的输出,使 Java 应用程序能获取脚本运行输出
PrintWriter out = new PrintWriter(pw);
engine.getContext().setWriter(out); engine.eval("println('hello from javascript!');"); BufferedReader br = new BufferedReader(pr);
System.out.println(br.readLine());
}
    //可编译且可调用的引擎
public static void test08() throws ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
if(engine instanceof Compilable){//判断脚本引擎是否支持编译操作
Compilable compilable = (Compilable)engine;//用来保存编译的结果,从而能重复调用脚本而没有重复解释的开销
//compile()方法将脚本编译成无需重新编译就能反复执行的CompiledScript容器
CompiledScript script = compilable.compile("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}"); Bindings bindings = engine.createBindings();
bindings.put("age", 26);
bindings.put("noClaims", Boolean.TRUE);
bindings.put("riskFactor", 1.0); Object result = script.eval(bindings);//使用CompiledScript的eval()方法计算编译后的表达式
System.out.println(result.toString());
}
}
   //调用脚本中的函数和方法
public static void test09() throws ScriptException, NoSuchMethodException, FileNotFoundException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.eval("function increment(i){return i+1;}");
if (engine instanceof Invocable) {//判断脚本引擎是否支持编译操作
Invocable invocable = (Invocable)engine;//Invocable允许从java代码调用定义在脚本中的单个函数
Object result = invocable.invokeFunction("increment", new Object[]{10});// 调用脚本中定义的顶层程序和函数
System.out.println("result = "+result);
} ScriptEngine engine2 = manager.getEngineByName("js");
engine2.eval(new FileReader("E:/ScriptEngine/test03.js"));
if(engine2 instanceof Invocable){
Invocable invocable = (Invocable)engine2;
invocable.invokeMethod(engine2.get("hello"), "sayHello", "yangYong");//对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法
}
}

定义java文件Hello.java

public interface Hello {
public int increment(int value);
public void sayHello(String name);
}
    //调用脚本中的函数和方法并将他们作为java程序中的接口实现
public static void test10() throws FileNotFoundException, ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.eval("function increment(i){return i+1;}");
if (engine instanceof Invocable) {
Invocable invocable = (Invocable)engine;
Hello hello = invocable.getInterface(Hello.class);//返回一个接口的实现,该接口使用解释器中编译的函数
Object result = hello.increment(2);
System.out.println("result = "+result);
}
engine.eval(new FileReader("E:/ScriptEngine/test03.js"));
if(engine instanceof Invocable){
Invocable invocable2 = (Invocable)engine;
Hello hello = invocable2.getInterface(engine.get("hello"), Hello.class);// 返回一个接口的实现,该接口使用解释器中已编译脚本对象的成员函数
hello.sayHello("zhangSan");
}
}

java6内置JS引擎初接触的更多相关文章

  1. Eclipse spket插件 内置js文件

    这一篇将怎么在spket内置js文件,而不用用户自己去添加.    1. 在开发的Eclipse的 运行配置将下面几个插件勾选上.     2. 在org.eclipse.ui.startup拓展里执 ...

  2. [转]Windows10内置Linux子系统初体验

    Windows10内置Linux子系统初体验 https://www.jianshu.com/p/bc38ed12da1d

  3. ArcGIS for Server内置JS Viewer的离线部署和配置

    很多情况下,在地图服务发布完毕后,我们往往利用 ArcGIS for Server内置的 JS Viewer来查看和检测所发布的地图服务是否满足我们的要求.具体操作如下: 点击开始 -> 所有程 ...

  4. Windows10内置Linux子系统初体验

    http://www.jianshu.com/p/bc38ed12da1dhttp://www.jianshu.com/p/bc38ed12da1d WSL 前言 前段时间,机子上的win10又偷偷摸 ...

  5. .net MVC内置js验证 jquery.validate.unobtrusive.js重置验证操作(备忘,找了很多次了)

    (function ($) { $.validator.unobtrusive.parseDynamicContent = function (selector) { //use the normal ...

  6. 🤔 移动端 JS 引擎哪家强?美国硅谷找......

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...

  7. JS中的常量(基本数据类型)和内置对象

    JS中的基本数据类型: String .number.null.boolean.undefined.object.symbol(ES6) 1.  利用typeof运算符时其中只有null是异常的,ty ...

  8. 170104、js内置对象与原生对象

    内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集:而后者包括了一些在运行过程中动态创建的对象. 原生对象 ...

  9. 【ES6】改变 JS 内置行为的代理与反射

    代理(Proxy)可以拦截并改变 JS 引擎的底层操作,如数据读取.属性定义.函数构造等一系列操作.ES6 通过对这些底层内置对象的代理陷阱和反射函数,让开发者能进一步接近 JS 引擎的能力. 一.代 ...

随机推荐

  1. wuzhicms 后台登录存留时间实现方式

    在五指后台管理登录后,超过半小时不操作后台(不刷新页面或切换页面),就就会强制退出后台. 实现的思路是,在每次刷新页面都把当前时间存储下来,利用php的session机制来检测比对当前时间和数据库中存 ...

  2. 《Java数据结构与算法》笔记-CH1

    /** * 数据结构的特性 ************************************************************************************** ...

  3. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  4. sonar 代码质量管理平台

    1) 下载    从sonar官网http://www.sonarsource.org/下载 (版本当然是最新的了)   在官网上是不分系统的,一个zip包,下下来之后,包里包含 windows .l ...

  5. PLSQL Developer 常用设置及快捷键

    1.登录后自动选中My Objects(已验证可用) 默认情况下,PLSQL Developer登录后,Brower里会选择all Objects,如果你登录的用户是DBA, 要展开tables目录, ...

  6. FPGA高级设计——时序分析和收敛(转)

    何谓静态时序分析(Static Timing Analysis,简称STA)? 它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分 ...

  7. uLua学习笔记(三):Unity3D和Lua之间的相互调用

    这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...

  8. C#学习笔记(四):委托和事件

    刚开始学习C#的时候就写过了,直接给地址了: 委托.匿名函数.Lambda表达式和事件的学习 委托学习续:Action.Func和Predicate

  9. Redis学习_01 windows下的环境搭建

    一.Redis 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...

  10. ASCII,GB2312,GBK,Unicode,Utf-8

    1.ASCII:American Stardand Code for Information Interchange,是当时美国制定出来的一套编码系统,使用7位或8位二进制来表示西文字符,0-31以及 ...