1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java執(zhí)行g(shù)roovy腳本的兩種方式

        共 11136字,需瀏覽 23分鐘

         ·

        2021-04-25 10:04

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          作者 |  蒲公英不是夢(mèng)

        來(lái)源 |  urlify.cn/222iMv

        記錄Java執(zhí)行groovy腳本的兩種方式,簡(jiǎn)單粗暴:

        一種是通過(guò)腳本引擎ScriptEngine提供的eval(String)方法執(zhí)行腳本內(nèi)容;一種是執(zhí)行groovy腳本;

        二者都通過(guò)Invocable來(lái)傳遞參數(shù)并獲取執(zhí)行結(jié)果;

        Invocable:腳本引擎的解釋器接口,提供invokeFunctioninvokeMethod兩種傳遞參數(shù)并獲取執(zhí)行結(jié)果的方法,Java JDK API文檔解釋如下:

        invokeFunction:

        invokeMethod:

        以下為案例:

        引入依賴

        <dependency>
         <groupId>org.codehaus.groovy</groupId>
         <artifactId>groovy-all</artifactId>
         <version>1.2.74</version>
        </dependency>

        定義腳本內(nèi)容并執(zhí)行

        public void testByFunction(){
            // 初始化Bindings
            Bindings bindings = engine.createBindings();
            // 綁定參數(shù)
            bindings.put("date", new Date());
            final String name = "groovy";
            // 定義groovy腳本中執(zhí)行方法的名稱
            final String scriptName = "execute";
            // 定義groovy腳本內(nèi)容
            final String scriptContent = "def " + scriptName +"(name){" +
                                         "    println(\"now dateTime is: ${date.getTime()}\");" +
                                         "    println(\"my name is $name\");" +
                                         "    return date.getTime() > 0;" +
                                         "}";
            try {
                // 執(zhí)行腳本
                engine.eval(scriptContent, bindings);
                // 獲取執(zhí)行結(jié)果
                Invocable invocable = (Invocable) engine;
                Boolean flag = (Boolean) invocable.invokeFunction(scriptName, name);
                System.out.println("---------------------------------------");
                System.out.println("result is: " + flag);
            } catch (ScriptException | NoSuchMethodException e) {
                e.printStackTrace();
            }
        }

        運(yùn)行結(jié)果:

        • invokeFunction方法的第一個(gè)參數(shù)為腳本的函數(shù)名稱,把scriptName拎出來(lái)通過(guò)創(chuàng)建String對(duì)象再賦值進(jìn)去,方便你看懂函數(shù)名稱到底是哪個(gè);

        • scriptContent${date.getTime()}$name的意思一樣,grovvy中的字符串可以識(shí)別${}$占位符;

        • bindings綁定參數(shù)與invokeFunction方法的第二個(gè)參數(shù)的區(qū)別是,前者是腳本內(nèi)全局的,而后者是定義在函數(shù)內(nèi)的;

        例如把腳本內(nèi)容定義為這樣:

        執(zhí)行結(jié)果就是這樣了:

        實(shí)例化腳本對(duì)象并執(zhí)行

        public void testByMethod(){
            try {
                // 初始化groovy腳本對(duì)象
                final TestGroovy testGroovy = new TestGroovy();
                // 定義groovy腳本中執(zhí)行方法的名稱
                final String scriptName = "execute";
                // 定義參數(shù)
                final Date arg_1 = new Date();
                final String arg_2 = "groovy";
                // 執(zhí)行腳本并獲取結(jié)果
                Invocable invocable = (Invocable) engine;
                Boolean flag = (Boolean) invocable.invokeMethod(testGroovy, scriptName, arg_1, arg_2);
                System.out.println("---------------------------------------");
                System.out.println("result is: " + flag);
            } catch (ScriptException |NoSuchMethodException e) {
                e.printStackTrace();
            }
        }

        TestGroovy.groovy腳本內(nèi)容:

        package com.dandelion.groovy

        class TestGroovy {
           static def execute(Date date, String name){
                println("now dateTime is: ${date.getTime()}");
                println("my name is $name");
                return date.getTime() < 0;
            }
        }

        運(yùn)行結(jié)果:

        • invokeMethod方法的第一個(gè)參數(shù)是腳本對(duì)象,第二個(gè)參數(shù)是腳本中的函數(shù)名稱,之后為綁定的參數(shù);

        源碼:

        package com.dandelion.test;

        import com.dandelion.groovy.TestGroovy;

        import javax.script.*;
        import java.util.Date;

        /**
         * ================================
         * 測(cè)試groovy腳本的執(zhí)行方式
         * @Author Him
         * @Date 2021-04-21
         * @Time 01:12
         * ================================
         */
        public class TestScriptEngine {

            // 查找并創(chuàng)建指定腳本引擎
            private ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy");

            public void testByFunction(){
                // 初始化Bindings
                Bindings bindings = engine.createBindings();
                // 綁定參數(shù)
                bindings.put("date", new Date());
                // 定義groovy腳本中執(zhí)行方法的名稱
                final String scriptName = "execute";
                // 定義groovy腳本內(nèi)容
                final String scriptContent = "def " + scriptName +"(){" +
                                             "    println(\"now dateTime is: ${date.getTime()}\");" +
                                             "    return date.getTime() > 0;" +
                                             "}";
                try {
                    // 執(zhí)行腳本
                    engine.eval(scriptContent, bindings);
                    // 獲取執(zhí)行結(jié)果
                    Invocable invocable = (Invocable) engine;
                    Boolean flag = (Boolean) invocable.invokeFunction(scriptName);
                    System.out.println("---------------------------------------");
                    System.out.println("result is: " + flag);
                } catch (ScriptException | NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }

            public void testByMethod(){
                try {
                    // 初始化groovy腳本對(duì)象
                    final TestGroovy testGroovy = new TestGroovy();
                    // 定義groovy腳本中執(zhí)行方法的名稱
                    final String scriptName = "execute";
                    // 定義參數(shù)
                    final Date arg_1 = new Date();
                    final String arg_2 = "groovy";
                    // 執(zhí)行腳本并獲取結(jié)果
                    Invocable invocable = (Invocable) engine;
                    Boolean flag = (Boolean) invocable.invokeMethod(testGroovy, scriptName, arg_1, arg_2);
                    System.out.println("---------------------------------------");
                    System.out.println("result is: " + flag);
                } catch (ScriptException |NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }

            public static void main(String[] args) {
                TestScriptEngine engine = new TestScriptEngine();
                engine.testByFunction();
            }
        }






        粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

        ??????

        ??長(zhǎng)按上方微信二維碼 2 秒


        感謝點(diǎn)贊支持下哈 

        瀏覽 102
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            九九久久精品视频 | 嬷嬷羞耻调教后宫日常h视频 | 麻豆成人影音 | 超碰免费在线97 | 爱爱夜激情网 | 中文字幕88 | 美女131mm久久爽爽免费 | 亚洲无码免费网站 | 一级全黄60分钟免费看 | 精品黄色在线 |