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引擎JAVA215

一、S02E215_01脚本引擎执行javascript代码_Rhino引擎

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

基本测试代码 public static void main(String[] args){ //Context 用来存储对应线程的数据,一个线程只对应唯一的context Context ...

纯java 的javascript引擎:rhino .

纯java 的javascript引擎:rhino   来源:http://www.javaeye.com/topic/87423   前段时间,在浏览javaeye论坛,看见有人征集如何...

java动态编程-Rhino脚本引擎

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

JDK8中Java调用Javascript脚本引擎动态定义与执行代码

JDK8中Java调用Javascript脚本引擎动态定义与执行代码
  • alaclp
  • alaclp
  • 2014年10月07日 10:20
  • 2367

c#动态执行代码(Javascript引擎)

  • 2008年12月06日 09:32
  • 2KB
  • 下载

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

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

Mozilla Rhino:使用java语言来解释和执行javascript脚本(转)

 Mustang 的脚本引擎 JSR 233 为 Java 设计了一套脚本语言 API。这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。任何实现了这一接口的脚本语...

[Java][Js]利用Rhino在服务器端执行JavaScript、并实现Java与JavaScript相互调用

利用Rhino在服务器端执行JavaScript 最近本人在学习流程引擎Activiti的时候接触到了Rhino感觉在蛮有意思的、在一些在开放平台中注入自定义代码时蛮有用的。这是一种在Java代码...

3. javascript 引擎Rhino源代码分析 浅析 实例函数对象及this

1.  目标         主要通过分析Rhino,讲述javascript创建对象及this的意义 2.  javascript测试代码         var vipObj = new vipF...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 动态编译与用Rhino引擎执行javascript代码
举报原因:
原因补充:

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