• OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言


    友情提示

    本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合。

    本文中的代码注释比较多,不再过多解释。

    更多用法,还是得看JDK的API或者看原文http://developer.51cto.com/art/201007/208812.htm

    1.可用的脚本引擎

     

     /**
         * Java内置只支持JavaScript一种脚本
         * 打印Script引擎的一些信息
         */
        public static void printBuildInScriptEngine() {
            ScriptEngineManager manager = new ScriptEngineManager();
            List<ScriptEngineFactory> factories = manager.getEngineFactories();
            for (ScriptEngineFactory factory : factories) {
                println("engine name:" + factory.getEngineName());
                println("engine version:" + factory.getEngineVersion());
                println("language name:" + factory.getLanguageName());
                println("language version:" + factory.getLanguageVersion());
                println("names:" + factory.getNames());
                println("mime:" + factory.getMimeTypes());
                println("extension:" + factory.getExtensions());
            }
        }

    2.一个“HelloWorld”程序

     

     /**
         *  在Java中使用JavaScript的Hello world示例
         */
        public static void printHelloWorld() {
            ScriptEngine engine = getJavaScriptEngine();
            String helloWorldScript = "print('hello script')";
            try {
                engine.eval(helloWorldScript);
            } catch (ScriptException e) {
                e.printStackTrace();
            }
            println();
        }

    3.方法调用-第1种方式

     

     /**
         *  可以向脚本中传递变量,使得Java代码可以和脚本代码交互
         */
        public static void invokeFunction() {
            ScriptEngine engine = getJavaScriptEngine();
            engine.put("a", 13);
            engine.put("b", 24);
            try {
                String maxFunction = JS_MAX_FUNCTION_AND_INVOKE;
                Object maxNum = engine.eval(maxFunction);
                println("max:" + maxNum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    4.方法调用-第2种方式

     

      /**
         * 方法调用,第2种方式
         */
        public static void invokeFunction2() {
            ScriptEngine engine = getJavaScriptEngine();
            try {
                engine.eval(JS_MAX_FUNCTION);
                Invocable invoke = (Invocable) engine;
                Object maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 88, 99);
                println(maxNum);
                maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 99, 111);
                println(maxNum);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }

    5.方法调用-第3种方式

      /**
         * 方法调用第3种方式
         */
        public static void invokeFunction3() {
            ScriptEngine engine = getJavaScriptEngine();
            try {
                engine.eval(JS_MAX_FUNCTION);
                Invocable invoke = (Invocable) engine;
                JSLib jslib = invoke.getInterface(JSLib.class);
                int maxNum = jslib.max(2013, 1989);
                println(maxNum);
            } catch (Exception e) {
                e.printStackTrace();
    
            }
        }

    6.在JavaScript中使用Java对象和方法

     

     /**
         * 在JavaScript中使用Java对象和方法
         */
        public static void useJavaObject() {
            ScriptEngine engine = getJavaScriptEngine();
            try {
                String script = "var list = java.util.ArrayList();list.add('CSDN FanUnion');print(list.get(0));";
                engine.eval(script);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    7.编译JS代码,然后执行

     

    /**
         * 编译JS代码,然后执行
         */
        public static void compileExecute() {
            ScriptEngine engine = getJavaScriptEngine();
            try {
                Compilable compEngine = (Compilable) engine;
                CompiledScript script = compEngine.compile(JS_MAX_FUNCTION);
                script.eval();
                //强制转换,Invocable和Compilable都是脚本引擎可选实现的
                //如果这个地方的脚本引擎没有实现这个接口,应该会报错
                Invocable invoke = (Invocable) engine;
                Object maxNum = invoke
                        .invokeFunction(MAX_FUNCTION_NAME, 2020, 2050);
                println(maxNum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    8.工具方法和接口

     

    /**
         * 工具方法:创建JS-引擎
         */
        private static ScriptEngine getJavaScriptEngine() {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName(JS_ENGINE_NAME);
            return engine;
        }
        
        public static void println() {
            System.out.println();
        }
    
        public static void println(Object str) {
            System.out.println(str);
        }
    
       /**
         * 定义了求最大值的一个接口
         */
        interface JSLib {
            public int max(int a, int b);
        }

    下载地址:本文已经给出了所有的源代码了。建议自己写一遍,不懂的参考API。

    CSDN下载频道有源码,需要1分。(有兴趣的自己花1分,下载吧)

    上传资源,迟迟不出来,晚点再给出下载地址

    http://download.csdn.net/detail/fansunion/6821829

    参考资料http://developer.51cto.com/art/201007/208812.htm

    原文链接:http://blog.fansunion.cn/articles/2839(小雷博客-blog.fansunion.cn)

  • 相关阅读:
    关于路径的小知识点
    转发与重定向
    一种反复的读写文件的方法
    文字排版reportlab
    Qgis中插件的安装位置
    spyder打开文件假死解决
    地图跳跃-超级码力
    尾部的零
    一探torch.nn究竟“What is torch.nn really?”
    KAZE特征和各向异性扩散滤波
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463308.html
Copyright © 2020-2023  润新知