`
FansUnion
  • 浏览: 166417 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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)

分享到:
评论

相关推荐

    在Java中使用脚本语言JavaScript

    * 在Java中使用脚本语言JavaScript。 * * @author LeiWen@FansUnion.cn,http://FansUnion.cn, * http://blog.csdn.net/FansUnion * * QQ:240370818 参考资料:...

    openjdk jdk源码

    5. **并发和多线程**:Java以其强大的并发模型而闻名,OpenJDK的源码揭示了`java.util.concurrent`包下各种并发工具类的实现,如`ExecutorService`、`Future`、`Lock`等。 6. **JMX(Java Management Extensions)*...

    openjdk8完整源码

    3. 类库实现:Java的标准类库如集合框架、I/O流、网络通信等,其底层实现都可以在OpenJDK源码中找到,这对于理解API的工作方式非常有帮助。 二、JVM解析 1. 类加载器:Java的类加载机制是双亲委派模型,OpenJDK...

    openjdk8源码官网下载地址

    10. **nashorn**:Nashorn是Java 8引入的JavaScript引擎,它允许在Java应用程序中执行JavaScript代码。 11. **test**:这个目录包含了大量的测试用例,用于验证JDK各个部分的功能正确性。 除了这些目录外,还有...

    第 1 部分: 引入 Java 脚本 API

    Java 脚本 API,也称为 Java Scripting API,是Java平台标准版(Java SE)的一部分,它允许Java应用程序在运行时执行脚本语言代码。这个API在Java 6版本中得到了显著增强,为开发者提供了在Java程序中嵌入和执行脚本...

    openjdk源码编译.zip

    在IT行业中,Java是一种广泛应用的编程语言,而OpenJDK是Java Development Kit(JDK)的一个开源实现。本文将深入探讨如何编译OpenJDK源码,以及涉及到的相关工具和步骤。 首先,我们关注到"CLion-2021.1.tar.gz",...

    OpenJDK源码

    在OpenJDK源码中,你可以找到JVM的主要组件,如类加载器、执行引擎、内存管理(包括垃圾收集器,如G1、ZGC等)和性能优化策略。例如,HotSpot虚拟机是OpenJDK中广泛使用的JVM实现,它的源码展示了如何优化运行时性能...

    openjdk源码1

    这些变化都可以在源码中找到相应的实现和注释。 学习OpenJDK源码对于理解Java运行机制、优化程序性能以及参与Java平台的开发都是非常有益的。通过深入分析`openjdk-7u4-fcs-src-b22-02_may_2012`,开发者不仅可以...

    基于java的开发源码-OpenJDK Java开发环境.zip

    基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-...

    OpenJdk源码包

    8. **接口默认方法**:Java 8允许在接口中定义默认方法,这种方法可以提供默认实现,避免破坏已有的实现。 9. **Type注解**:Java 8增加了类型注解的支持,允许在类型使用处(如方法参数、返回值等)添加注解,增强...

    openjdk1.6

    OpenJDK 1.6是Java Development Kit的一个开源实现,它是Java编程语言和Java平台标准版(Java SE)的一部分。OpenJDK项目的目标是提供一个免费、开源的Java实现,鼓励社区参与和透明度,使得开发者可以查看并修改源...

    java jdk1.7源码包,用于centos7使用jdk1.7编译openjdk1.8的 1.7版本

    Java JDK 1.7源码包是用于在CentOS 7操作系统上进行OpenJDK 1.8编译的重要资源。这个源码包包含了Java Development Kit的1.7版本,通常被称为JDK 7,它是Oracle公司发布的Java编程语言和Java平台标准版的一个实现。...

    java-7-openjdk-amd64

    安装包:java-7-openjdk-amd64.tar.gz 使用方法 1. 拷贝至服务器/个人电脑 2. 解包 mkdir /opt/jdk/ tar -zxvf java-7-openjdk-amd64.tar.gz -C /opt/jdk/ 3. 配置编译环境 JAVA_HOME=/opt/jdk/java-7-openjdk-amd...

    openjdk-8.zip

    OpenJDK 8是Java开发工具包(Java Development Kit)的一个开源实现,它为开发者提供了构建、测试和运行Java应用程序所需的工具和Java虚拟机(JVM)。Ubuntu是一个流行的Linux操作系统,广泛用于服务器和桌面环境。...

    OpenJDK中rt.jar源码文件

    首先,需要在Eclipse的Java构建路径中添加源代码位置,指向OpenJDK的src.zip或源码目录。这样,在遇到不熟悉的方法或类时,可以直接跳转到源码,提高开发效率。 5. **学习价值**: 学习rt.jar源码有助于提升编程...

    openjdk7u源码

    在Java世界中,源码分析是提升技术能力的重要途径,尤其对于OpenJDK这种基础性软件,其源码更是开发者探索Java运行机制的金钥匙。OpenJDK 7U源码不仅包括了JVM的实现,还涵盖了类库和编译器等多个重要组件,这些组件...

    Openjdk11源码

    在源码中,你可以找到`java.lang`、`java.util`、`java.nio`等包的实现。 3. **内存模型和并发**:OpenJDK实现了Java内存模型(JMM),这是保证多线程程序正确性的关键。源码中包含了`java.util.concurrent`包的...

    java openJDK 源码, Hotspot

    java openJDK 源码, Hotspot, 未编译, 原始代码, 直接zip压缩包, java openJDK 源码, Hotspot, 未编译, 原始代码, 直接zip压缩包, java openJDK 源码, Hotspot, 未编译, 原始代码, 直接zip压缩包

    Java 8 Nashorn 脚本引擎

    4. **全局Java对象**:在Nashorn中,`java`、`javafx`和`javax`等Java包被暴露为全局对象,可以直接在JavaScript中使用。 5. **脚本API**:Java 8引入了`javax.script`包,提供了ScriptEngine接口,使得在Java应用中...

    openjdk8 源码

    《深入解析OpenJDK8源码》 OpenJDK8是Java开发的重要基础,它提供了Java虚拟机(JVM)和Java核心库的...通过研究源码,开发者可以深化对Java语言的理解,提高编程技巧,解决实际问题,从而在Java世界中更上一层楼。

Global site tag (gtag.js) - Google Analytics