最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java調(diào)用groovy腳本的方式分享

 更新時(shí)間:2023年04月12日 15:02:52   作者:阿Qoder  
Groovy?是一種基于?JVM?的動(dòng)態(tài)語(yǔ)言,與?Java?語(yǔ)言緊密集成,可以很方便地在?Java?項(xiàng)目中使用。本文為大家整理了Java調(diào)用groovy腳本的幾種方式,希望對(duì)大家有所幫助

前言

Groovy 是一種基于 JVM 的動(dòng)態(tài)語(yǔ)言,與 Java 語(yǔ)言緊密集成,可以很方便地在 Java 項(xiàng)目中使用。Groovy 有著簡(jiǎn)潔的語(yǔ)法、靈活的類(lèi)型系統(tǒng)、強(qiáng)大的元編程能力,適合編寫(xiě)各種類(lèi)型的腳本和應(yīng)用程序。使用groovy也可以實(shí)現(xiàn)java程序的動(dòng)態(tài)擴(kuò)展,和用于插件化的開(kāi)發(fā),增強(qiáng)系統(tǒng)的可擴(kuò)展性。

使用方式

GroovyShell

GroovyShell 是 Groovy 的一個(gè)核心類(lèi),它可以在 Java 中執(zhí)行 Groovy 代碼。

我們先寫(xiě)一個(gè)簡(jiǎn)單的groovy測(cè)試腳本,輸出 “hello world”。

package com.arm.groovy

println("GroovyShell test : hello world");

那么在java中怎么調(diào)用呢?其實(shí)只需要3行代碼就可以了:

GroovyShell shell = new GroovyShell();
Script script = shell.parse(new FileReader("test.groovy"));
script.run();
  • 其執(zhí)行過(guò)程是:首先實(shí)例化一個(gè)GroovyShell的對(duì)象,然后通過(guò)GroovyShell解析groovy腳本文件的內(nèi)容并返回Script對(duì)象,最后執(zhí)行run()方法,執(zhí)行腳本內(nèi)容。
  • 這種方式支持支持 REPL(Read-Eval-Print Loop)模式,可以在命令行中逐行輸入和執(zhí)行 Groovy 代碼。適用于快速測(cè)試和調(diào)試 Groovy 代碼,或者是項(xiàng)目中有獨(dú)立的可執(zhí)行的groovy腳本文件。

REPL(Read-Eval-Print Loop)是一種交互式編程環(huán)境,它允許用戶逐行輸入代碼,然后立即執(zhí)行,并輸出結(jié)果。REPL 環(huán)境通常用于快速測(cè)試和調(diào)試代碼,因?yàn)樗梢詫?shí)時(shí)地展示代碼執(zhí)行的結(jié)果,幫助用戶快速找到錯(cuò)誤和調(diào)試代碼。

在 Groovy 中,Groovy Shell 就是一種基于 REPL 的交互式編程環(huán)境。用戶可以在 Groovy Shell 中逐行輸入 Groovy 代碼,并立即執(zhí)行。當(dāng)用戶輸入一行代碼后,Groovy Shell 會(huì)立即對(duì)該代碼進(jìn)行解析、編譯和執(zhí)行,并輸出執(zhí)行結(jié)果,然后等待用戶輸入下一行代碼。由于 Groovy Shell 的實(shí)時(shí)執(zhí)行特性,它也常被用于探索性編程和演示代碼。

除了 Groovy Shell,其他語(yǔ)言和平臺(tái)也有類(lèi)似的 REPL 工具,如 Python 的交互式環(huán)境(Python REPL)、Node.js 的命令行工具(Node.js REPL)等。這些工具都是一種交互式編程環(huán)境,可以幫助用戶快速測(cè)試和調(diào)試代碼。

GroovyClassLoader

我們先寫(xiě)一個(gè)簡(jiǎn)單的groovy測(cè)試腳本,輸出 “hello world”。

package com.arm.groovy

def test() {
    println("GroovyClassLoader test : hello world");
}

那么在java中怎么調(diào)用呢?

try (GroovyClassLoader classLoader = new GroovyClassLoader()) {
    Class<?> groovyClass = classLoader.parseClass(new File("test.groovy"));
    GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
    groovyObject.invokeMethod("test", null);
}

其執(zhí)行過(guò)程是:首先實(shí)例化一個(gè)GroovyClassLoader的對(duì)象,然后通過(guò)GroovyClassLoader 解析groovy腳本并生成一個(gè)Class文件,在然后實(shí)例化一個(gè)GroovyObject,通過(guò)GroovyObject執(zhí)行腳本中的方法。

可以看到這種方式比較強(qiáng)大的,其通過(guò)類(lèi)加載的方式進(jìn)行腳本的加載和解析,使其在java中可以像調(diào)用java類(lèi)的方法一樣調(diào)用groovy腳本中的方法。因此GroovyClassLoader 適用于需要?jiǎng)討B(tài)加載和執(zhí)行 Groovy 腳本的場(chǎng)景,如插件化系統(tǒng)、動(dòng)態(tài)擴(kuò)展;也適用于一些需要在運(yùn)行時(shí)動(dòng)態(tài)生成和編譯代碼的場(chǎng)景。

比如我們可以定義個(gè)groovy類(lèi),其實(shí)現(xiàn)一個(gè)java接口,在java運(yùn)行時(shí)我們可以將這個(gè)groovy加載到spring容器中,通過(guò)bean的方式使用groovy腳本。

在 Groovy 中,所有的 Groovy 類(lèi)都是 Java 類(lèi)的子類(lèi),包括通過(guò) Groovy 腳本動(dòng)態(tài)生成的類(lèi)。因此,當(dāng)使用 GroovyClassLoader 加載 Groovy 腳本并編譯生成 Groovy 類(lèi)后,得到的 Class 對(duì)象實(shí)際上也是 Groovy 類(lèi)型的 Class 對(duì)象,可以被強(qiáng)制轉(zhuǎn)換為 GroovyObject 類(lèi)型。

GroovyObject 接口是所有 Groovy 類(lèi)的基類(lèi),它定義了 Groovy 類(lèi)的基本行為和屬性。因此,只要一個(gè)類(lèi)實(shí)現(xiàn)了 GroovyObject 接口,它就可以被認(rèn)為是一個(gè) Groovy 類(lèi)。在 Groovy 中,所有的 Groovy 類(lèi)都默認(rèn)實(shí)現(xiàn)了 GroovyObject 接口,因此,當(dāng)我們從 GroovyClassLoader 加載 Groovy 類(lèi)后,可以直接將其強(qiáng)制轉(zhuǎn)換為 GroovyObject 類(lèi)型。

當(dāng)然這種方式我們也可以直接寫(xiě)腳本代碼,而無(wú)需要腳本文件:

Binding binding = new Binding();
binding.setVariable("name", "Groovy");
GroovyShell shell = new GroovyShell(binding);
Object result = shell.evaluate("println 'Hello, ' + name");

上述示例直接用 shell.evaluate() 的方式直接執(zhí)行腳本語(yǔ)句。

ScriptEngineManager

首先我們還是準(zhǔn)備一個(gè)腳本文件:

package com.arm.groovy

println("ScriptEngineManager test : hello world");

java調(diào)用:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
engine.eval(new FileReader("test.groovy"));

其實(shí)這種方式和第一種方式大同小異,二選其一就可以了。

到此這篇關(guān)于Java調(diào)用groovy腳本的方式分享的文章就介紹到這了,更多相關(guān)Java調(diào)用groovy腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決idea中java出現(xiàn)無(wú)效的源發(fā)行版問(wèn)題

    解決idea中java出現(xiàn)無(wú)效的源發(fā)行版問(wèn)題

    這篇文章主要給大家介紹了關(guān)于解決idea中java出現(xiàn)無(wú)效的源發(fā)行版問(wèn)題的相關(guān)資料,無(wú)效的源發(fā)行版是指IntelliJ IDEA無(wú)法正確識(shí)別和處理的源代碼版本,這可能是由于錯(cuò)誤的配置、缺少依賴(lài)項(xiàng)、不兼容的插件或其他問(wèn)題導(dǎo)致的,需要的朋友可以參考下
    2024-01-01
  • maven私有鏡像倉(cāng)庫(kù)nexus部署使用

    maven私有鏡像倉(cāng)庫(kù)nexus部署使用

    Nexus在企業(yè)開(kāi)發(fā)中還是比較常用的私有倉(cāng)庫(kù)管理工具,本文主要介紹了maven私有鏡像倉(cāng)庫(kù)nexus部署使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類(lèi)詳解

    Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類(lèi)詳解

    這篇文章主要介紹了Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類(lèi)詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作

    IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作

    這篇文章主要介紹了IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • SpringBoot找不到映射文件的處理方式

    SpringBoot找不到映射文件的處理方式

    這篇文章主要介紹了SpringBoot找不到映射文件的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • redis redisson 限流器的實(shí)例(RRateLimiter)

    redis redisson 限流器的實(shí)例(RRateLimiter)

    這篇文章主要介紹了redis redisson 限流器的實(shí)例(RRateLimiter),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot使用阿里oss實(shí)現(xiàn)文件上傳的流程步驟

    SpringBoot使用阿里oss實(shí)現(xiàn)文件上傳的流程步驟

    云服務(wù)指的就是通過(guò)互聯(lián)網(wǎng)對(duì)外提供的各種各樣的服務(wù),比如像:語(yǔ)音服務(wù)、短信服務(wù)、郵件服務(wù)、視頻直播服務(wù)、文字識(shí)別服務(wù)、對(duì)象存儲(chǔ)服務(wù)等等,本文通過(guò)代碼示例和圖文給大家介紹了SpringBoot使用阿里oss實(shí)現(xiàn)文件上傳的流程步驟,需要的朋友可以參考下
    2025-01-01
  • java8保姆級(jí)lambda表達(dá)式教程

    java8保姆級(jí)lambda表達(dá)式教程

    這篇文章主要介紹了Java8之后的Lambda表達(dá)式的用法,lambda表達(dá)式將大量替代匿名內(nèi)部類(lèi)的使用,簡(jiǎn)化代碼的同時(shí),更突出了原來(lái)匿名內(nèi)部類(lèi)中最重要的那部分包含真正邏輯的代碼,需要的朋友可以參考下
    2023-03-03
  • 一文詳解Java8中的方法引用與構(gòu)造器引用

    一文詳解Java8中的方法引用與構(gòu)造器引用

    這篇文章主要為大家詳細(xì)介紹了Java8中的方法引用與構(gòu)造器引用的具體用法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02

最新評(píng)論

梓潼县| 新巴尔虎右旗| 西峡县| 涟水县| 泰宁县| 扬中市| 凉山| 蛟河市| 长岭县| 泾阳县| 恩平市| 双桥区| 舒城县| 石屏县| 嘉善县| 昌宁县| 行唐县| 淅川县| 岚皋县| 二连浩特市| 元江| 汝南县| 丰都县| 湖口县| 都江堰市| 宿迁市| 织金县| 黎城县| 玉环县| 阿坝县| 丹寨县| 房产| 新昌县| 吉安县| 灌阳县| 襄汾县| 宁波市| 安岳县| 商洛市| 凤冈县| 凤庆县|