一、概念

Java脚本引擎是jdk 6.0之后的新功能。

使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的。

Java脚本API是连接Java平台和脚本语言的桥梁。

可以把一些复杂的业务逻辑交给脚本语言处理,从而大大提高了开发效率。

【代码示例】

  1. /***
  2. * 测试脚本引擎 ,就是Java和脚本语言的中介
  3. */
  4. package cn.sxt.jvm;
  5.  
  6. import java.io.FileReader;
  7.  
  8. import java.net.URL;
  9. import java.util.List;
  10.  
  11. import javax.script.Invocable;
  12. import javax.script.ScriptEngine;
  13. import javax.script.ScriptEngineManager;
  14.  
  15. public class Test_0419_JavaScript {
  16. public static void main(String[] args) throws Exception {
  17. //获取脚本引擎对象
  18. ScriptEngineManager sem=new ScriptEngineManager();
  19. ScriptEngine engine=sem.getEngineByName("javascript");//或者传个缩写 "js"
  20.  
  21. // 定义变量,存储到引擎的上下文中。Java和JavaScript都可以读取到
  22. engine.put("msg", "Are you OK!");
  23. engine.eval("msg='小米手机';");//一段js代码
  24. System.out.println(engine.get("msg"));//用Java平台去输出,结果是"小米手机",说明msg变量修改成功了,证明
  25. //它可以被Java和JavaScript同时操作
  26.  
  27. //一段JavaScript脚本语言代码
  28. String str ="var user={name:'夏洛',age:18,schools:['北京大学','清华大学']};";
  29. str +="print(user.name);"; //写出println(user.name); 会报错即多个ln会报错,不知道为啥?
  30. //用引擎执行脚本语言代码
  31. engine.eval(str);//eval() 获取返回值
  32.  
  33. //定义js函数
  34. engine.eval("function add(a,b) { var sum=a+b; return sum;}");
  35. //取得调用接口
  36. Invocable jsInvoke =(Invocable) engine; //Invocable可调用的
  37. //执行脚本中定义的add方法 ,并传入参数
  38. Object result =jsInvoke.invokeFunction("add", new Object[]{13,20});//激活函数
  39. System.out.println(result);
  40.  
  41. //导入其它jar包,使用其它jar包中的Java类
  42. String jsCode=" var list=java.util.Arrays.asList([\"清华\",\"北大\"]);";
  43. engine.eval(jsCode);
  44. List<String> list2=(List<String>) engine.get("list");
  45. for (String temp : list2) {
  46. System.out.print(temp+" " );
  47. }
  48.  
  49. //执行一个外部的一个js文件 getClassLoader获得类加载器
  50. URL url=Test_0419_JavaScript.class.getClassLoader().getResource("add.js");
  51. //【注意】"add.js"的路径默认在项目的bin文件夹下(与src源码的.clss文件在一个文件夹下),而且要求项目名称是非中文。
  52. //js文件的默认字符是“UTF-8”,如果编译器的默认字符集是“GBK”,要注意乱码的问题!!
  53. FileReader fReader= new FileReader(url.getPath());
  54. engine.eval(fReader);
  55. fReader.close();
  56.  
  57. }
  58.  
  59. }

[19/04/19-星期五] Java的动态性_脚本(Script,脚本)引擎执行JavaScript代码的更多相关文章

  1. 尚学堂 215 在java中执行JavaScript代码

    package com.bjsxt.test; import java.io.FileReader; import java.net.URL; import java.util.List; impor ...

  2. JAVA中执行JavaScript代码并获取返回值

    JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...

  3. Java执行JavaScript代码

    Java执行JavaScript代码 这篇文章主要为大家详细介绍了Java执行JavaScript代码的具体操作方法,感兴趣的小伙伴们可以参考一下 我们要在Java中执行JavaScriptMetho ...

  4. [19/04/17-星期三] Java的动态性_反射(Reflection)机制

    一.前言 动态语言:程序运行时,可以改变程序结构或变量类型.典型的代表:Python,ruby,JavaScript 如JavaScript代码: function test(){ var s=&qu ...

  5. [19/04/18-星期四] Java的动态性_动态编译(DynamicCompiler,Dynamic:动态的,Compiler:编译程序)

    一.概念 应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行:服务器动态加载某些类文件进行编译 /*** * */ package cn.sxt.jvm; import java.io. ...

  6. [19/04/20-星期六] Java的动态性_字节码操作(Javassist类库(jar包),assist:帮助、援助)

    一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import ...

  7. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  8. [19/04/01-星期一] IO技术_字节流分类总结(含字节数组(Array)流、字节数据(Data)流、字节对象(Object)流)

    一.字节流分类概括 -->1.ByteArrayInputStream /ByteArrayOutputStream(数组字节输入输出)        InputStream/OutputStr ...

  9. [19/04/03-星期三] IO技术_其它流(RandomAccessFile 随机访问流,SequenceInputStream 合并流)

    一.RandomAccessFile 随机访问流 [版本1] /* *RandomAccessFile 所谓随机读取就是 指定位置开始或指定位置结束 的读取写入文件 * 实现文件的拆分与合并 模拟下载 ...

随机推荐

  1. [转] .NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要转载 一来是最近面试了几家公司,发现问的还都是这些的基础知识,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果. 为什么有人说,不动笔不读书.我现在也是深有体会了,看过的东西不一定会记得 ...

  2. [linux] C语言Linux系统编程-做成守护进程

    守护进程: 必须是init进程的子进程,运行在后台,不与任何控制终端相关联. 通过以下步骤成为守护进程 1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程 2.在新守护进程的父进程 ...

  3. HTTP完整请求过程

    重要申明:感谢原文作者——沐风的心,想看原文请戳这里!我借鉴了原文的页面请求流程,原文见时序图之后正文. 重要申明:感谢原文作者——一行两行,想看原文请戳这里!我借鉴了原文的完整HTTP请求流程. 增 ...

  4. linux ubuntu 学习总结(day01)基本命令学习

    个人总结,请尊重版权,转载请在显眼地方注明出处:https://www.cnblogs.com/sunshine5683/p/9948259.html day(01)基本命令学习 今天开始自学linu ...

  5. IIS6.0+PHP5.3+mssql 配置及远程连接数据库

    安装软件需求:IIS6.0.php5.3 .sqlsrv驱动.sql server ODBC驱动  所有软件压缩包下载 注意看:安装软件的环境需求,根据环境自行选择版本,例如odbc驱动老一点版本才能 ...

  6. JavaScript访问对象的属性和方法

    对象的属性和方法统称为对象的成员. 访问对象的属性 在JavaScript中,可以使用“ . ”和“ [ ] ”来访问对象的属性. 二者区别:“ . ”表示法一般作为静态对象使用时来存取属性.而“[ ...

  7. drupal7 STMP邮件模块配置

    drupal7.54 STMP  version = "7.x-1.6" 配置:   注意:上面的“用户名”需要和“站点信息”页面的电子邮件地址保持一致,邮件发送才能成功 ---- ...

  8. CentOS6.5(2)----安装Tab键自动补全功能:bash-completion

    首先要确保网络畅通,因为该过程要通过网络下载相关的软件包. 在 root 用户下,使用 cd ~/Downloads 命令进入下载文件夹,然后依次输入如下三个命令: [root@prime:~/Doc ...

  9. Linux / mysql: is it safe to copy mysql db files with cp command from one db to another?

    Copying is very simple for MyISAM and completely 100% risky (near suicidal) with InnoDB. From your q ...

  10. EventTarge Node Docuement Element HTMLElement 关系

    综述: 可以将其看做是依次继承的关系: Node Node A Node is an interface from which a number of DOM types inherit, and a ...