热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

8.4(Java学习笔记)java脚本引擎(Rhino)

一、java脚本引擎java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的脚本引擎在java中调用各种脚本语言。二、脚本引擎执行脚本代码ScriptEngineM

一、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

 


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
author-avatar
V陈冬梅_717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有