Java脚本引擎执行js代码以及动态编译
Java脚本引擎执行js代码
一、概述
- JAVA脚本引擎是从JDK6.0之后添加的新功能。
- 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本语言的目的。
- Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。
- 可以把一些复杂易变的业务逻辑交给脚本语言处理,这又大大提高了 开发效率。
二、脚本引擎使用示例
//获得脚本引擎对象,它是java和js的中介
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");//定义变量,存储到引擎上下文中,通过java和脚本均可获取
engine.put("msg", "gaoqi is a good man!");
String str = "var user = {name:'gaoqi',age:18,schools:['清华大学','北京大学']};";
str += "print(user.name);";//执行脚本
engine.eval(str);
engine.eval("msg = 'sxt is a good school';");
System.out.println(engine.get("msg"));
System.out.print("###########################");//定义函数
engine.eval("function add(a,b){var sum = a + b; return sum;}");
//取得调用接口
Invocable jsInvoke = (Invocable) engine;
//执行脚本中定义的方法
Object result1 = jsInvoke.invokeFunction("add", new Object[]{13,20});
System.out.println(result1);//导入其他java包,使用其他包中的java类.若需要深入了解细节,可以详细学习Rhino的语法
String jsCode = "importPackage(java.util); var list=Arrays.asList([\"清华大学\",\"北京大学\"]);";
engine.eval(jsCode);List<String> list2 = (List<String>)engine.get("list");
for (String temp : list2) {System.out.print(temp);
}//执行一个js文件(我们将a.js至于项目的src下即可)
URL url = Demo01.class.getClassLoader().getResource("a.js");
FileReader fr = new FileReader(url.getPath());
engine.eval(fr);
fr.close();
三、动态编译
概述
- 动态编译应用场景
- 可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测 系统。
- 服务器动态加载某些类文件进行编译
- 动态编译的两种做法
- 通过Runtime调用javac,启动新的进程去操作
Runtime run = Runtime.getRuntime(); Process process = run.exec(“javac -cp d:/myjava/ HelloWorld.java”); - 通过JavaCompiler动态编译
- 通过Runtime调用javac,启动新的进程去操作
- 动态编译应用场景
通过JavaCompiler动态编译
public static int compileFile(String sourceFile){ //动态编译 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null,sourceFile); System.out.println(result==0?" 编 译 成 功 ":" 编 译 失 败 "); return result; }
- 第一个参数:为java编译器提供参数
- 第二个参数:得到 Java 编译器的输出信息
- 第三个参数:接收编译器的 错误信息
- 第四个参数:可变参数(是一个String数组)能传入一个或多个 Java 源文件
- 返回值:0表示编译成功,非0表示编译失败
- 动态运行编译好的类
- 通过Runtime. g e t R u n ti m e () 运行启动新的进程运行
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/myjava HelloWorld");
- 通过反射运行编译好的类
//通过反射运行程序
public static void runJavaClassByReflect(String dir,String classFile) throws Exception{ try { URL[] urls = new URL[] {new URL("file:/"+dir)}; URLClassLoader loader = new URLClassLoader(urls); Class c = loader.loadClass(classFile); //调用加载类的main方法 c.getMethod("main",String[].class).invoke(null, (Object)new String[]{}); } catch (Exception e) {e.printStackTrace(); } }
ps:m.invoke(null, new String[]{“aa”,“bb”});会编译成:m.invoke(null,“aa”,“bb”),就发生了参数个数不匹配的问题。因此,必须要加上(Object)转型,避免这个问题。
Java脚本引擎执行js代码以及动态编译相关推荐
- 【Java脚本引擎】脚本引擎执行JavaScript代码
应用场景 公司有30员工,每个人工资计算方式不同.现在需要计算工资. 传统的方法:一个接口,30个实现类. 使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时 ...
- Java动态性(3) - 脚本引擎执行javascript代码
1.脚本引擎执行JavaScript代码 脚本引擎介绍 使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的 Java脚本API是连通Java平 ...
- js引擎执行js代码的过程
js引擎执行js代码的过程 html解析 浏览器下载网页时,浏览器内核解析html.当遇到script标签时,下载js代码并将js代码以流的形式传递给js引擎让js引擎进行js代码的解析. 语义语法分 ...
- java 脚本引擎执行javascript脚本
java脚本引擎是从JDK6.0之后添加的新功能,语法使用Rhino. public class ScriptTest {public static void main(String args[]) ...
- 什么?java中居然可以执行js代码了?真是不知者不怪
今天在书上看的,java中可以直接调用js的函数了,言外之意就是java已经支持外部的脚本语言了(在运行期解释执行的),查了查,jdk从1.6之后开始支持的,1.6之前不可以. 为什么Java这种编译 ...
- python执行js脚本安全吗_手把手教你如何使用Python执行js代码
前言 各位小伙伴,大家好,这次咱们来说一下关于爬虫方向的一个知识,Python如何执行js,快来看看吧!!! 为什么要引出Python执行js这个问题? 都说术业有专攻,每个语言也都有自己的长处和短处 ...
- java fel_Java表达式引擎fel/groovy/expression4j/java脚本引擎的性能对比【原创】
又是性能对比,最近跟性能较上劲了. 产品中需要用到数学表达式,表达式不复杂,但是对性能要求比较高.选用了一些常用的表达式引擎计算方案,包含:java脚本引擎(javax/script).groovy脚 ...
- Java 脚本引擎的使用
文章目录 1. 前言 2. 脚本引擎的使用 2.1 脚本参数传递 2.2 脚本编译 2.3 脚本动态调用 1. 前言 Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Jav ...
- Java 脚本引擎 Rhino的学习
转自 https://www.cnblogs.com/huang-changfan/p/10129518.html java脚本引擎 java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的 ...
最新文章
- 对方不想和你说话 php,对方不想和你聊天的表现,遇到后赶紧放弃
- 常见的几种异常类型 Exception
- java实现第三方网页获取微信用户授权后的微信用户基本信息
- 【项目管理】ITTO-采购管理
- 洛阳理工Linux实验报告,洛阳理工学院实验报告.doc
- 用户空间访问I2C设备驱动
- 关于双黑洞和引力波,LIGO科学家回答了这7个你可能会关心的问题
- mysql+ubunt+绿色安装_Mysql在ubuntu18上的安装及简单使用
- Python机器学习:梯度下降法008如何确定梯度计算的准确性,调试梯度下降法
- archlinux 更新错误 Unrecognized archive format
- Tensorflow rnn-word2vec-电影评论
- Python 异常处理
- python opencv人脸识别考勤系统
- 牛顿迭代公式(详细)
- Linux服务器集群系统LVS(一)
- 移动互联网技术(wifi)
- 服务器防火墙关闭开机自启解决方案
- 深入浅出Linux操作系统指令与目录结构(二)
- Cicero:一个单细胞染色质可及性实验可视化R包
- 激发波长近红外二区发光量子点,近红外二区(NIR-II)发射波长(1000-1700 nm)
热门文章
- js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程
- Acrobat DC打开pdf文件出现“内容准备进度”提示
- Windows 清空Redis数据
- 苹果云空间 iCloud云空间6s 7 8Plus X XSMax 11Pro 121314移除
- 1975: [Sdoi2010]魔法猪学院
- 如何一个月学会C语言
- 拓扑排序以及迪杰斯特拉算法和弗洛伊德算法的一些例子(天勤数据结构)
- 振兴中华python实现
- JQuery方法带回调函数
- 微信小程序适配iPhoneX底部小黑条