[19/04/19-星期五] Java的动态性_脚本(Script,脚本)引擎执行JavaScript代码
一、概念
Java脚本引擎是jdk 6.0之后的新功能。
使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的。
Java脚本API是连接Java平台和脚本语言的桥梁。
可以把一些复杂的业务逻辑交给脚本语言处理,从而大大提高了开发效率。
【代码示例】
/***
* 测试脚本引擎 ,就是Java和脚本语言的中介
*/
package cn.sxt.jvm; import java.io.FileReader; import java.net.URL;
import java.util.List; import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager; public class Test_0419_JavaScript {
public static void main(String[] args) throws Exception {
//获取脚本引擎对象
ScriptEngineManager sem=new ScriptEngineManager();
ScriptEngine engine=sem.getEngineByName("javascript");//或者传个缩写 "js" // 定义变量,存储到引擎的上下文中。Java和JavaScript都可以读取到
engine.put("msg", "Are you OK!");
engine.eval("msg='小米手机';");//一段js代码
System.out.println(engine.get("msg"));//用Java平台去输出,结果是"小米手机",说明msg变量修改成功了,证明
//它可以被Java和JavaScript同时操作 //一段JavaScript脚本语言代码
String str ="var user={name:'夏洛',age:18,schools:['北京大学','清华大学']};";
str +="print(user.name);"; //写出println(user.name); 会报错即多个ln会报错,不知道为啥?
//用引擎执行脚本语言代码
engine.eval(str);//eval() 获取返回值 //定义js函数
engine.eval("function add(a,b) { var sum=a+b; return sum;}");
//取得调用接口
Invocable jsInvoke =(Invocable) engine; //Invocable可调用的
//执行脚本中定义的add方法 ,并传入参数
Object result =jsInvoke.invokeFunction("add", new Object[]{13,20});//激活函数
System.out.println(result); //导入其它jar包,使用其它jar包中的Java类
String jsCode=" var list=java.util.Arrays.asList([\"清华\",\"北大\"]);";
engine.eval(jsCode);
List<String> list2=(List<String>) engine.get("list");
for (String temp : list2) {
System.out.print(temp+" " );
} //执行一个外部的一个js文件 getClassLoader获得类加载器
URL url=Test_0419_JavaScript.class.getClassLoader().getResource("add.js");
//【注意】"add.js"的路径默认在项目的bin文件夹下(与src源码的.clss文件在一个文件夹下),而且要求项目名称是非中文。
//js文件的默认字符是“UTF-8”,如果编译器的默认字符集是“GBK”,要注意乱码的问题!!
FileReader fReader= new FileReader(url.getPath());
engine.eval(fReader);
fReader.close(); } }
[19/04/19-星期五] Java的动态性_脚本(Script,脚本)引擎执行JavaScript代码的更多相关文章
- 尚学堂 215 在java中执行JavaScript代码
package com.bjsxt.test; import java.io.FileReader; import java.net.URL; import java.util.List; impor ...
- JAVA中执行JavaScript代码并获取返回值
JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...
- Java执行JavaScript代码
Java执行JavaScript代码 这篇文章主要为大家详细介绍了Java执行JavaScript代码的具体操作方法,感兴趣的小伙伴们可以参考一下 我们要在Java中执行JavaScriptMetho ...
- [19/04/17-星期三] Java的动态性_反射(Reflection)机制
一.前言 动态语言:程序运行时,可以改变程序结构或变量类型.典型的代表:Python,ruby,JavaScript 如JavaScript代码: function test(){ var s=&qu ...
- [19/04/18-星期四] Java的动态性_动态编译(DynamicCompiler,Dynamic:动态的,Compiler:编译程序)
一.概念 应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行:服务器动态加载某些类文件进行编译 /*** * */ package cn.sxt.jvm; import java.io. ...
- [19/04/20-星期六] Java的动态性_字节码操作(Javassist类库(jar包),assist:帮助、援助)
一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import ...
- [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)
一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...
- [19/04/01-星期一] IO技术_字节流分类总结(含字节数组(Array)流、字节数据(Data)流、字节对象(Object)流)
一.字节流分类概括 -->1.ByteArrayInputStream /ByteArrayOutputStream(数组字节输入输出) InputStream/OutputStr ...
- [19/04/03-星期三] IO技术_其它流(RandomAccessFile 随机访问流,SequenceInputStream 合并流)
一.RandomAccessFile 随机访问流 [版本1] /* *RandomAccessFile 所谓随机读取就是 指定位置开始或指定位置结束 的读取写入文件 * 实现文件的拆分与合并 模拟下载 ...
随机推荐
- async和await理解代码
<1>:Async和Await的理解1 using System; using System.Collections.Generic; using System.Linq; using S ...
- [javaSE] 多线程(守护线程)
我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...
- 工作经验:Java 系统记录调用日志,并且记录错误堆栈
前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...
- EF框架CodeFirst the model backing the 'PModelEntities' context has changed since the database was created. Consider using Code First Migrations to update the database
1.采用code first 做项目时,数据库已经生成,后期修改数据库表结构.再次运行时出现一下问题: Entity Framework : The model backing the 'Produc ...
- UNIX 网络编程笔记-CH3:套接字编程简介
IPv4套接字地址结构 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; /* length of ...
- 样式 bootstrap purecss Amaze UI 推荐
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单. Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAV ...
- 一键清理 Nexus 中无用的 Docker 镜像
现许多团队使用 Nexus 来管理 Docker 镜像,产品不断迭代,镜像仓库占用的磁盘空间也越来越大.由于 Nexus 的控制台并未提供批量操作镜像功能,清理镜像十分不便.本文分享一个清理 Nexu ...
- Python爬虫教程-06-爬虫实现百度翻译(requests)
使用python爬虫实现百度翻译(requests) python爬虫 上一篇介绍了怎么使用浏览器的[开发者工具]获取请求的[地址.状态.参数]以及使用python爬虫实现百度翻译功能[urllib] ...
- 同步(Synchronous)和异步(Asynchronous)的概念
web项目中的同步与异步 在我们平时的web项目开发中会经常听到ajax请求这样一个称呼,在web项目中可以通过js或者jquery发送同步请求又或者异步请求,同步请求呢往往代表着你必须等待这次请求结 ...
- C# WinForm窗体及其控件自适应各种屏幕分辨率
C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置 ...