ScriptEngineManager

package com.qijiabin.script;
import java.io.FileReader;
import java.util.List;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * ========================================================
 * 日 期:2016年10月11日 下午5:29:19
 * 版 本:1.0.0
 * 类说明:
 * TODO
 * ========================================================
 * 修订日期     修订人    描述
 */
public class ScriptEngineManagerDemo {

    /**
     * 打印Script引擎
     */
    public static void printAllEngine() {
        ScriptEngineManager manager = new ScriptEngineManager();
        List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
        for (ScriptEngineFactory factory : factoryList) {
            System.out.println(factory.getEngineName());
            System.out.println(factory.getEngineVersion());
            System.out.println(factory.getLanguageName());
            System.out.println(factory.getLanguageVersion());
            System.out.println(factory.getExtensions());
            System.out.println(factory.getMimeTypes());
            System.out.println(factory.getNames());
        }
    }

    /**
     * 执行JavaScript代码
     */
    public static void exeJSForCode() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        String script = "print (‘http://blog.163.com/nice_2012/‘)";
        try {
            engine.eval(script);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行JavaScript文件代码
     */
    public static void exeJSForFile() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            FileReader reader = new FileReader("file.js");
            engine.eval(reader);
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Binding AND Exception
     */
    public static void exeJSForBinding() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        engine.put("a", 1);
        engine.put("b", 5);
        Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
        Object a = bindings.get("a");
        Object b = bindings.get("b");
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        try {
            Object result = engine.eval("c = a + b;");
            System.out.println("a + b = " + result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }

    }

    /**
     * Function
     */
    public static void exeJSForFunction() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            engine.eval("function add (a, b) {c = a + b; return c; }");
            Invocable jsInvoke = (Invocable) engine;
            Object result1 = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
            System.out.println(result1);

            Adder adder = jsInvoke.getInterface(Adder.class);
            int result2 = adder.add(10, 5);
            System.out.println(result2);
        } catch (ScriptException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }

    /**
     * Compilable
     */
    public static void exeJSForCompilable() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        Compilable jsCompile = (Compilable) engine;
        try {
            CompiledScript script = jsCompile.compile("function hi () {print (‘hello" + "‘); }; hi ();");
            for (int i = 0; i < 5; i++) {
                script.eval();
            }
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行 JavaScript
     */
    public static void exeJavaScript() {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        try {
            Double hour = (Double) engine.eval("var date = new Date(); date.getHours();");
            String msg;
            if (hour < 10) {
                msg = "Good morning";
            } else if (hour < 16) {
                msg = "Good afternoon";
            } else if (hour < 20) {
                msg = "Good evening";
            } else {
                msg = "Good night";
            }
            System.out.println(hour);
            System.out.println(msg);
        } catch (ScriptException e) {
            System.err.println(e);
        };
    }

    static interface Adder {

        int add(int a, int b);

    }

    public static void main(String[] args) {
        printAllEngine();
        exeJSForCode();
        exeJSForFile();
        exeJSForBinding();
        exeJSForFunction();
        exeJSForCompilable();
        exeJavaScript();
    }

}
时间: 2024-10-28 20:54:52

ScriptEngineManager的相关文章

使用ScriptEngineManager解析json

使用ScriptEngineManager能够解析比較复杂的json串,应用比較方便,可是效率不敢说,由于这种方法相当于执行了一次js.会占资源, 代码例如以下: try { String mdskipJson = ""; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); String s=&quo

ScriptEngineManager类(Java和JS互相调用)

Java和Js之间的调用时基于ScriptEngineManager类,这个类是jdk8新增的: import java.io.File; import java.util.ArrayList; import java.util.List; import javax.script.Bindings; import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine;

利用ScriptEngineManager实现简单的规则运算

在JAVA开发过程中,有时会遇到一些小运算.比如传入一个List集合,我们需要根据集合中的某一属性做过滤. 相信这种场景大家都有遇到过,通常的解决办法是直接在java代码中写好一些比较规则,实现上也是比较简单的. 但是如果这个规则是动态的呢,假如A类型的数据,我们根据A字段过滤,B类型的数据,我们根据字段B过滤.这时突然又来了个C类型的数据,难道又要写个C的过滤方法,再重新发布上线吗? 当然是不用的,JAVA的开发大牛早就帮我们想好了解决的办法.因为JAVA本身编译型的限制,我们可以使用Java

Matlab中使用jython扩展功能

Matlab中面向对象能力并不强,通过使用jython引擎能够对其功能扩展. 1 编辑classpath.txt增加jython.jar 在matlab中输入 which classpath.txt 结果: /usr/local/MATLAB/R2013a/toolbox/local/classpath.txt 编辑该文件,加入 /home/your_user/jython2.5.3/jython.jar 2 又一次启动matlab 3 编写代码測试 import javax.script.In

Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为注释,嵌入到代码中,看代码时就能更容易理解,代码中会用到一个计算结果的工具类,见文章代码部分. 相关的基础知识文章推荐: Linux 网络 I/O 模型简介(图文) Jav

Java新特性之Nashorn的实例详解

Nashorn是什么 Nashorn,发音"nass-horn",是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范.你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象.这个需要注意的一个点. 关于Nashorn的入门 主要是两个方面,jjs工具以及javax.script包下面的API: jjs是在j

Java 脚本化编程指南

译文出处: coyee   原文出处:docs.oracle Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象.此外,脚本语言往往会自动执行许多类型的转换,例如, 必要时 将数字10转换为"10". 开发快速原型:您可以避免编辑编译运行周期,只使用"编辑运行"! 应用扩展/定制:你可以"具体化"的部分应用程序,例如一些

转载--编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)

阅读目录 建议16:易变业务使用脚本语言编写 建议17:慎用动态编译 建议18:避免instanceof非预期结果 建议19:断言绝对不是鸡肋 建议20:不要只替换一个类 回到顶部 建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它们都是在运行期解释执行的.为什么Java这种强编译型语言会需要这些脚本语言呢?那是因为脚本语言的三大特征,如下所示:

尚学堂_java300集笔记_手写服务器

195.httpserver_准备_Socket入门 public class Server { private ServerSocket server; public static void main(String[] args) { Server server = new Server(); server.start(); } public void start() { try { server = new ServerSocket(8080); String msg = null; thi