文档章节

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

FansUnion
 FansUnion
发布于 2015/05/03 01:27
字数 672
阅读 20
收藏 1
点赞 0
评论 0

友情提示

本文主要参考了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)

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 56
博文 857
码字总数 825464
作品 0
丰台
高级程序员

暂无相关文章

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 41分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 50分钟前 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 10

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部