java 动态编译与用Rhino引擎执行javascript代码

原创 2017年01月03日 19:08:50

动态编译

/**
 * 动态编译
 * @author L J
 */
@SuppressWarnings("all")
public class TestCompile {
    public static void main(String[] args) {
        String str = "public class Compile {public static void main(String[] args) {System.out.println(\"hello world!\");}}";
        try {
            //将字符串输出到文件中
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:/DB/Compile.java")));
            writer.write(str);
            writer.flush();
            writer.close();

            //动态编译
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            int result = compiler.run(null, null, null, "F:/DB/Compile.java");
            System.out.println(result == 0 ? "编译成功" : "编译失败");

            /*1、通过RunTime动态运行
            Runtime run = Runtime.getRuntime();
            Process process = run.exec("java -cp F:/DB Compile");

            //获取输出结果
            InputStream in = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String info = "";
            while((info = reader.readLine()) != null) {
                System.out.println(info); //hello world!
            }*/

            //2、通过URLClassLoader加载编译好的文件,利用反射运行main方法
            URL[] urls = new URL[]{new URL("file:/" + "F:/DB/")};
            URLClassLoader loader = new URLClassLoader(urls);
            Class c = loader.loadClass("Compile");
            //调用加载类的main方法
            Method m = c.getMethod("main", String[].class);
            //由于可变参数是JDK5.0之后才有的,所以会被编译成:m.invoke(null, "aa", "bb"),会发生参数不匹配的问题
            //所以强制转换成Object类型
            m.invoke(null, (Object)new String[]{"aa", "bb"});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

用脚本引擎执行javascript代码

/**
 * 测试脚本引擎执行javascript代码
 * @author L J
 */
@SuppressWarnings("all")
public class JavaScriptEngine {
    public static void main(String[] args) throws Exception {
        //获得脚本引擎对象
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("javascript");

        //定义变量(即可以被js操作,又可以被java操作),存储到引擎上下文中
        engine.put("msg", "that's why you go away!");
        String str = "var user = {name:'小明', age:18, schools:['清华大学', '北京大学']};";
        str += "println(user.name)"; //println只能打印在java控制台

        //执行脚本
        engine.eval(str);  //小明
        engine.eval("msg = 'baby!'");
        System.out.println(engine.get("msg")); //baby!

        //定义函数
        engine.eval("function add(a, b) {var sum = a + b; return sum}");
        //取得调用接口
        Invocable jsInvoke = (Invocable) engine;
        Object result = jsInvoke.invokeFunction("add", new Object[]{12, 23});
        System.out.println(result); //35.0

        //导入其他java包、使用其他包中的java类
        String jsCode = "importPackage(java.util);" +
                "var list = Arrays.asList([\"清华大学\", \"北京大学\", \"浙江大学\"]);";
        engine.eval(jsCode);

        List<String> list = (List<String>) engine.get("list");
        for(String temp : list) {
            System.out.println(temp);
        }

        //执行一个js文件(以下需要将js文件置于项目的src目录下)
        URL url = JavaScriptEngine.class.getClassLoader().getResource("test.js");
        FileReader fr = new FileReader(url.getPath());
        engine.eval(fr);
        fr.close();
    }
}

JavaScript引擎速度比较: rhino 与 V8

java 下的rhino 和 C++ 下的 V8 都是非常出色的开源的JavaScript引擎。 最近本人因为工作需要对这两个引擎进行了一些研究,发现两个的一些不同。 1.使用难以程度     ...
  • a137993530
  • a137993530
  • 2015年05月13日 19:54
  • 1347

采用Rhino在JAVA中运行JavaScript

由于有些网页采用的是swing技术实现(用swing也可以做出好看的界面),在其中使用JavaScript的话可以采用Rhino 对于Rhino的介绍和使用可以参看这篇文章——Rhino 使 Jav...
  • fengshuiyue
  • fengshuiyue
  • 2017年05月15日 16:07
  • 1386

Java学习之动态编译-动态脚本引擎-脚本引擎执行javascript代码

脚本引擎执行javascript代码 JAVA脚本引擎是从JDK6.0之后添加的新功能。脚本引擎介绍: 使得JAVA应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在JAVA平台上调...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月14日 22:44
  • 2044

2. javascript 引擎Rhino源代码分析 简单代码分析

基本测试代码 public static void main(String[] args){ //Context 用来存储对应线程的数据,一个线程只对应唯一的context Context ...
  • liantian_wu
  • liantian_wu
  • 2015年11月08日 21:30
  • 815

Android JS解析引擎 Rhino 使用笔记(不借助webview)

在使用过程中有个需求是在不大改动移动端现有处理逻辑的基础上,通过后期配置来灵活更改本地的逻辑联系。最终选定的方案是借助Js,一开始想到用webview,但webview开销大。经查找,最终使用了 Rh...
  • haha_zhan
  • haha_zhan
  • 2017年07月24日 09:35
  • 1211

1. javascript 引擎Rhino源代码分析 简介

Rhino背景:     Rhino 是 著名的javascript引擎 spiderMonkey 的java版. spiderMonkey出自javascript之 父布兰登·艾奇之手.     ...
  • liantian_wu
  • liantian_wu
  • 2015年11月08日 19:22
  • 799

java动态编程-Rhino脚本引擎

java 6.0提供一些标准接口来操作脚本语言,它让java有能力在代码中,动态的执行脚本语言,接口的实现就由第三方来实现。Rhino引擎是一个实现javascript脚本接口的第三方实现,java6...
  • yingxiake
  • yingxiake
  • 2016年05月24日 10:32
  • 807

Rhino详解:Java与JS互操作

深入浅出Rhino:Java与JS互操作 什么是Rhino? Rhino 是JavaScript 的一种基于Java的实现,原先由Mozilla开发,现在被集成进入JDK 6.0。下面这两行代码...
  • gladmustang
  • gladmustang
  • 2014年11月30日 13:20
  • 2148

java,javascript,groovy和Rhino 的运行效率到底相差的有多远?

我author:emu(黄希彤)在Groovy 学习笔记3 运行效率 和初识Rhino 中都用8皇后问题来比较java,javascript,groovy和Rhino 的运行效率。一开始考虑到8皇后只...
  • emu
  • emu
  • 2005年07月13日 18:11
  • 4395

深入浅出 Rhino:Java 与 JS 互操作

什么是Rhino?   Rhino 是 JavaScript 的一种基于Java的实现,原先由Mozilla开发,现在被集成进入JDK 6.0。下面这两行代码恰好说明了这一点。   imp...
  • DavidHsing
  • DavidHsing
  • 2013年05月28日 16:55
  • 12374
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 动态编译与用Rhino引擎执行javascript代码
举报原因:
原因补充:

(最多只允许输入30个字)