国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java中調(diào)用groovy腳本的幾種方式

這篇具有很好參考價(jià)值的文章主要介紹了java中調(diào)用groovy腳本的幾種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

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

使用方式

GroovyShell

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

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

package com.arm.groovy

println("GroovyShell test : hello world");
復(fù)制代碼

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

GroovyShell shell = new GroovyShell();
Script script = shell.parse(new FileReader("test.groovy"));
script.run();
復(fù)制代碼
  • 其執(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)也有類似的 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");
}
復(fù)制代碼

那么在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);
}
復(fù)制代碼

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

可以看到這種方式比較強(qiáng)大的,其通過(guò)類加載的方式進(jìn)行腳本的加載和解析,使其在java中可以像調(diào)用java類的方法一樣調(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類,其實(shí)現(xiàn)一個(gè)java接口,在java運(yùn)行時(shí)我們可以將這個(gè)groovy加載到spring容器中,通過(guò)bean的方式使用groovy腳本。

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

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

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

Binding binding = new Binding();
binding.setVariable("name", "Groovy");
GroovyShell shell = new GroovyShell(binding);
Object result = shell.evaluate("println 'Hello, ' + name");
復(fù)制代碼

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

ScriptEngineManager

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

package com.arm.groovy

println("ScriptEngineManager test : hello world");
復(fù)制代碼

java調(diào)用:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
engine.eval(new FileReader("test.groovy"));
復(fù)制代碼

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

作者:阿Qoder
鏈接:https://juejin.cn/post/7220775341605322810
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-620250.html

到了這里,關(guān)于java中調(diào)用groovy腳本的幾種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java發(fā)送http請(qǐng)求的幾種方式,調(diào)用第三方接口的方法:HttpUtil、HttpURLConnection等

    參考:https://blog.csdn.net/yubin1285570923/article/details/126225347 put請(qǐng)求 post帶請(qǐng)求頭 get、delete類似… 使用JDK原生提供的net,無(wú)需其他jar包,代碼如下: 需要用到commons-httpclient-3.1.jar,maven依賴如下: 看一下我實(shí)際應(yīng)用的例子 需要用到httpclient-4.5.6.jar,maven依賴如下: RestTemplate 是由

    2024年01月18日
    瀏覽(34)
  • JAVA開(kāi)發(fā)(通過(guò)Apollo注入配置信息的幾種方式)

    JAVA開(kāi)發(fā)(通過(guò)Apollo注入配置信息的幾種方式)

    在springCloud中有一個(gè)重要的組件就是配置中心,config:server,用于配置springboot中需要注入的各種配置項(xiàng)。但是現(xiàn)在發(fā)現(xiàn)越來(lái)越多的企業(yè)使用Apollo進(jìn)行集成。博主在開(kāi)發(fā)中也是使用Apollo進(jìn)行配置。本文總結(jié)Apollo的的使用,集成到springboot,和注入方式等。 ? Apollo是攜程框架部門(mén)研

    2024年02月09日
    瀏覽(23)
  • Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

    Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

    1.類什么時(shí)候被加載到JVM中,new,Class.forName: Class.forName(“包名.類名”); 2.創(chuàng)建對(duì)象的方式,反射,本質(zhì)是獲得類的類對(duì)象Class; 3.克隆clone,深拷貝,淺拷貝的對(duì)比; 4.序列化和反序列化的方式; Hello h; // 此時(shí)沒(méi)有用Hello,jvm并沒(méi)有進(jìn)行類加載 看到new : new Book() Class.forName:

    2024年02月12日
    瀏覽(30)
  • 運(yùn)行 Python 腳本/代碼的幾種方式

    運(yùn)行 Python 腳本/代碼的幾種方式

    哈嘍大家好,我是咸魚(yú) 我們知道,python 腳本或者說(shuō) python 程序其實(shí)是一個(gè)包含了 python 代碼的文件。要讓它們實(shí)現(xiàn)特定功能,我們需要知道該如何運(yùn)行(run)它 通過(guò)運(yùn)行 python 代碼,我們可以驗(yàn)證腳本/程序是否按照我們的期望執(zhí)行。這也使我們能夠?qū)ζ溥M(jìn)行測(cè)試和調(diào)試,以便

    2024年02月08日
    瀏覽(18)
  • 1685_Excel的幾種腳本處理方式

    1685_Excel的幾種腳本處理方式

    全部學(xué)習(xí)匯總: GreyZhang/python_basic: My learning notes about python. (github.com) 做個(gè)小結(jié),實(shí)際上是寫(xiě)的我自己學(xué)習(xí)的過(guò)程。 關(guān)于Excel的處理方式很多,我也不會(huì)那么多,在這里我只想寫(xiě)一下我自己接觸過(guò)的。大致是三種方式:MATLAB、Perl以及Python。 MATLAB實(shí)際上調(diào)用了win32的接口,因此

    2023年04月22日
    瀏覽(17)
  • SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    一、使用 CompletableFuture 實(shí)現(xiàn)異步任務(wù) CompletableFuture 是 Java 8 新增的一個(gè)異步編程工具,它可以方便地實(shí)現(xiàn)異步任務(wù)。使用 CompletableFuture 需要滿足以下條件: 異步任務(wù)的返回值類型必須是 CompletableFuture 類型; 在異步任務(wù)中使用 CompletableFuture.supplyAsync() 或 CompletableFuture.runAsy

    2024年02月08日
    瀏覽(23)
  • Python調(diào)用API接口的幾種方式

    Python調(diào)用API接口的幾種方式 相信做過(guò)自動(dòng)化運(yùn)維的同學(xué)都用過(guò)API接口來(lái)完成某些動(dòng)作。API是一套成熟系統(tǒng)所必需的接口,可以被其他系統(tǒng)或腳本來(lái)調(diào)用,這也是自動(dòng)化運(yùn)維的必修課。 本文主要介紹python中調(diào)用API的幾種方式,下面是python中會(huì)用到的庫(kù)。 - urllib2 - httplib2 - pycu

    2024年02月12日
    瀏覽(26)
  • vue子組件調(diào)用父組件方法的幾種方式

    一、直接在子組件中通過(guò)? this.$parent.event來(lái)調(diào)用父組件方法 父組件 子組件 二、在子組件里用 $emit 向父組件觸發(fā)一個(gè)事件,父組件監(jiān)聽(tīng)這個(gè)事件 父組件 子組件 三、父組件將方法傳入子組件,子組件直接調(diào)用 父組件 子組件

    2024年02月12日
    瀏覽(25)
  • Labview實(shí)現(xiàn)用戶界面切換的幾種方式---通過(guò)VI間相互調(diào)用

    Labview實(shí)現(xiàn)用戶界面切換的幾種方式---通過(guò)VI間相互調(diào)用

    在做用戶界面時(shí)我們的程序往往面對(duì)的 對(duì)象是程序使用者 ,復(fù)雜程序如果放在同一個(gè)頁(yè)面中,往往會(huì)導(dǎo)致程序冗長(zhǎng)卡頓,此時(shí)通過(guò)多個(gè)VI之間的切換就可以實(shí)現(xiàn)多個(gè)界面之間的轉(zhuǎn)換,也會(huì)顯得程序更加的高大上。 本文所有程序均可下載,下載地址在文章結(jié)尾列舉~ 本文同樣以

    2024年01月19日
    瀏覽(784)
  • Java創(chuàng)建對(duì)象的幾種方式

    在Java中,對(duì)象是程序中的一種基本元素,它通過(guò)類定義和創(chuàng)建。本篇教程旨在介紹Java中創(chuàng)建對(duì)象的幾種方式,包括使用new、反射、clone、反序列化等方式。 在Java中,最常用的創(chuàng)建對(duì)象方式是使用new。使用new創(chuàng)建對(duì)象的具體步驟如下: 使用new并指定

    2024年02月12日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包