Java脚本引擎执行js代码

一、概述

  1. JAVA脚本引擎是从JDK6.0之后添加的新功能。
  2. 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本语言的目的。
  3. Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。
  4. 可以把一些复杂易变的业务逻辑交给脚本语言处理,这又大大提高了 开发效率。

二、脚本引擎使用示例

//获得脚本引擎对象,它是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();

三、动态编译

  1. 概述

    • 动态编译应用场景

      • 可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测 系统。
      • 服务器动态加载某些类文件进行编译
    • 动态编译的两种做法
      1. 通过Runtime调用javac,启动新的进程去操作
        Runtime run = Runtime.getRuntime(); Process process = run.exec(“javac -cp d:/myjava/ HelloWorld.java”);
      2. 通过JavaCompiler动态编译
  2. 通过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表示编译失败
  1. 动态运行编译好的类
  • 通过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代码以及动态编译相关推荐

  1. 【Java脚本引擎】脚本引擎执行JavaScript代码

    应用场景 公司有30员工,每个人工资计算方式不同.现在需要计算工资. 传统的方法:一个接口,30个实现类. 使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时 ...

  2. Java动态性(3) - 脚本引擎执行javascript代码

    1.脚本引擎执行JavaScript代码 脚本引擎介绍 使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的 Java脚本API是连通Java平 ...

  3. js引擎执行js代码的过程

    js引擎执行js代码的过程 html解析 浏览器下载网页时,浏览器内核解析html.当遇到script标签时,下载js代码并将js代码以流的形式传递给js引擎让js引擎进行js代码的解析. 语义语法分 ...

  4. java 脚本引擎执行javascript脚本

    java脚本引擎是从JDK6.0之后添加的新功能,语法使用Rhino. public class ScriptTest {public static void main(String args[]) ...

  5. 什么?java中居然可以执行js代码了?真是不知者不怪

    今天在书上看的,java中可以直接调用js的函数了,言外之意就是java已经支持外部的脚本语言了(在运行期解释执行的),查了查,jdk从1.6之后开始支持的,1.6之前不可以. 为什么Java这种编译 ...

  6. python执行js脚本安全吗_手把手教你如何使用Python执行js代码

    前言 各位小伙伴,大家好,这次咱们来说一下关于爬虫方向的一个知识,Python如何执行js,快来看看吧!!! 为什么要引出Python执行js这个问题? 都说术业有专攻,每个语言也都有自己的长处和短处 ...

  7. java fel_Java表达式引擎fel/groovy/expression4j/java脚本引擎的性能对比【原创】

    又是性能对比,最近跟性能较上劲了. 产品中需要用到数学表达式,表达式不复杂,但是对性能要求比较高.选用了一些常用的表达式引擎计算方案,包含:java脚本引擎(javax/script).groovy脚 ...

  8. Java 脚本引擎的使用

    文章目录 1. 前言 2. 脚本引擎的使用 2.1 脚本参数传递 2.2 脚本编译 2.3 脚本动态调用 1. 前言 Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Jav ...

  9. Java 脚本引擎 Rhino的学习

    转自 https://www.cnblogs.com/huang-changfan/p/10129518.html java脚本引擎 java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的 ...

最新文章

  1. 对方不想和你说话 php,对方不想和你聊天的表现,遇到后赶紧放弃
  2. 常见的几种异常类型 Exception
  3. java实现第三方网页获取微信用户授权后的微信用户基本信息
  4. 【项目管理】ITTO-采购管理
  5. 洛阳理工Linux实验报告,洛阳理工学院实验报告.doc
  6. 用户空间访问I2C设备驱动
  7. 关于双黑洞和引力波,LIGO科学家回答了这7个你可能会关心的问题
  8. mysql+ubunt+绿色安装_Mysql在ubuntu18上的安装及简单使用
  9. Python机器学习:梯度下降法008如何确定梯度计算的准确性,调试梯度下降法
  10. archlinux 更新错误 Unrecognized archive format
  11. Tensorflow rnn-word2vec-电影评论
  12. Python 异常处理
  13. python opencv人脸识别考勤系统
  14. 牛顿迭代公式(详细)
  15. Linux服务器集群系统LVS(一)
  16. 移动互联网技术(wifi)
  17. 服务器防火墙关闭开机自启解决方案
  18. 深入浅出Linux操作系统指令与目录结构(二)
  19. Cicero:一个单细胞染色质可及性实验可视化R包
  20. 激发波长近红外二区发光量子点,近红外二区(NIR-II)发射波长(1000-1700 nm)

热门文章

  1. js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程
  2. Acrobat DC打开pdf文件出现“内容准备进度”提示
  3. Windows 清空Redis数据
  4. 苹果云空间 iCloud云空间6s 7 8Plus X XSMax 11Pro 121314移除
  5. 1975: [Sdoi2010]魔法猪学院
  6. 如何一个月学会C语言
  7. 拓扑排序以及迪杰斯特拉算法和弗洛伊德算法的一些例子(天勤数据结构)
  8. 振兴中华python实现
  9. JQuery方法带回调函数
  10. 微信小程序适配iPhoneX底部小黑条