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)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值