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

Java動(dòng)態(tài)腳本Groovy

 更新時(shí)間:2021年12月14日 10:51:06   作者:南國(guó)以南i  
本文介紹了Java動(dòng)態(tài)腳本Groovy,Groovy是用于Java虛擬機(jī)的一種敏捷的動(dòng)態(tài)語(yǔ)言,它是一種成熟的面向?qū)ο缶幊陶Z(yǔ)言,既可以用于面向?qū)ο缶幊?,又可以用作純粹的腳本語(yǔ)言。使用該種語(yǔ)言不必編寫過(guò)多的代碼,同時(shí)又具有閉包和動(dòng)態(tài)語(yǔ)言中的其他特性,需要的朋友可以參考一下

1.Groovy特性

可將java代碼在Groovy腳本動(dòng)態(tài)編碼、代碼被修改達(dá)到不重啟服務(wù)的目的(類似于熱部署)

2.核心涉及

  • ClassLoader:就是類的裝載器,它使JVM可以動(dòng)態(tài)的載入Java類,JVM并不需要知道從什么地方(本地文件、網(wǎng)絡(luò)等)載入Java類,這些都由ClassLoader完成。
  • GroovyClassLoader:動(dòng)態(tài)地加載一個(gè)腳本并執(zhí)行它的行為。GroovyClassLoader是一個(gè)定制的類裝載器,負(fù)責(zé)解釋加載Java類中用到的Groovy類。

3.Java與Groovy轉(zhuǎn)換

第一步:引入Groovy依賴

   <!--Groovy腳本依賴-->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.5.14</version>
        </dependency>

第二步:創(chuàng)建interface接口聲明方法

public interface CallAnalysis {
     default void load() {
    }
}

第三步:在resources目錄下創(chuàng)建.groovy文件

package groovy

import com.example.groovy.testgroovy.task.CallAnalysis
import groovy.util.logging.Slf4j

@Slf4j
class CallAnalysisImpl implements CallAnalysis{

    @Override
    void load() {
        log.info("我被Groovy腳本加載...")
    }
}

第四步:創(chuàng)建Groovy腳本裝載類,動(dòng)態(tài)解析腳本為Class

package com.example.groovy.testgroovy.task;

import groovy.lang.GroovyClassLoader;

public class GroovyUtils {

    private final static ClassLoader classLoader = GroovyUtils.class.getClassLoader();//獲取當(dāng)前類裝載器
    //ClassLoader:就是類的裝載器,它使JVM可以動(dòng)態(tài)的載入Java類,JVM并不需要知道從什么地方(本地文件、網(wǎng)絡(luò)等)載入Java類,這些都由ClassLoader完成。

    public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader);
    //GroovyClassLoader:負(fù)責(zé)在運(yùn)行時(shí)編譯groovy源代碼為Class的工作,從而使Groovy實(shí)現(xiàn)了將groovy源代碼動(dòng)態(tài)加載為Class的功能。

    /**
     * .
     * 獲取實(shí)例化對(duì)象
     * @param script groovy腳本內(nèi)容
     * @param <T>
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static <T> T instanceTaskGroovyScript(String script) throws IllegalAccessException, InstantiationException {
        Class taskClz = groovyClassLoader.parseClass(script);
        T instance = (T) taskClz.newInstance();
        return instance;
    }
}

第五步:讀取腳本內(nèi)容,執(zhí)行腳本

package com.example.groovy.testgroovy.task;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;


@Slf4j
@Component
public class CallAnalysisGroovyTask {


    /**
     * .
     * 讀取腳本內(nèi)容
     *
     * @return
     */
    public static String getGroovy() {
        String context = "";
        try {
            String path = "E:\\IDEAFile\\testgroovy\\src\\main\\resources\\groovy\\CallAnalysisImpl.groovy";
            context = FileUtils.readFileToString(new File(path));//將腳本內(nèi)容轉(zhuǎn)為字符串
        } catch (IOException e) {
            log.error("file is not found[{}]", e);
        }
        return context;
    }

    /**
     * .
     * 執(zhí)行g(shù)roovy腳本
     *
     * @param script
     */
    public static void execGroovy(String script) {
        try {
            CallAnalysis objClass = GroovyUtils.instanceTaskGroovyScript(script);//獲取實(shí)例對(duì)象
            objClass.load();//調(diào)用腳本方法
        } catch (Exception t) {
            log.error("execGroovy file {} error", script);
        }
    }

    /**
     * .
     * main方法
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("==================");
        CallAnalysisGroovyTask task = new CallAnalysisGroovyTask();
        String script = task.getGroovy();//獲取腳本
        execGroovy(script);//實(shí)例化腳本,執(zhí)行方法
        System.out.println("==================");
    }
}

4.Groovy特性驗(yàn)證

利用Groovy腳本特性,不重啟服務(wù),實(shí)時(shí)修改數(shù)據(jù)

第一步:將之前Groovy腳本數(shù)據(jù)修改。存于數(shù)據(jù)庫(kù)表中,動(dòng)態(tài)加載腳本

@Slf4j
class CallAnalysisImpl implements CallAnalysis {

    private int anInt = 10;
    private int bnInt = 10;

    @Override
    void load() {
        log.info("當(dāng)前類:[{}]", this.getClass().getName())
        log.info("我被Groovy腳本加載...")
        log.info("計(jì)算結(jié)果:[{}]", (anInt + bnInt))
    }
}


第二步:數(shù)據(jù)庫(kù)表中:添加、查詢Groovy腳本,動(dòng)態(tài)加載執(zhí)行

 /**
     * .
     * 讀取腳本,進(jìn)行入庫(kù)操作
     *
     * @return
     */
    @GetMapping("/saveScript")
    public String saveScript() {
        String scriptStr = callAnalysisGroovyTask.getGroovy();
        Script script = new Script();//實(shí)體類對(duì)象
        script.setScript(scriptStr);//腳本內(nèi)容
        script.setRuleId("1");//規(guī)則id
        script.setScriptName("演示一");//腳本名稱
        service.save(script);
        return "添加成功";
    }


    /**
     * .
     * 從數(shù)據(jù)庫(kù)表中,動(dòng)態(tài)獲取腳本
     *
     * @param ruleId 規(guī)則id
     * @return 腳本內(nèi)容
     */
    @GetMapping("/groovy")
    public String groovy(final String ruleId) {
        Script scr = scriptService.findScriptByRuleId(ruleId);//根據(jù)規(guī)則id查詢
        String scriptStr = scr.getScript();
        callAnalysisGroovyTask.execGroovy(scriptStr);
        return scriptStr;
    }


添加結(jié)果:

?查詢結(jié)果、控制臺(tái)執(zhí)行結(jié)果:

第三步:多次修改表數(shù)據(jù)值,查看執(zhí)行結(jié)果

5.總語(yǔ)

目的達(dá)成,可見(jiàn)在不重啟服務(wù)時(shí),多次修改數(shù)據(jù),腳本內(nèi)容都會(huì)被動(dòng)態(tài)加載。此處只是簡(jiǎn)單舉例驗(yàn)證,可自行擴(kuò)展

到此這篇關(guān)于Java動(dòng)態(tài)腳本Groovy的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)腳本Groovy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟

    Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟

    這篇文章主要為大家介紹了Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟,感興趣的小伙伴們可以參考一下
    2016-05-05
  • springboot實(shí)現(xiàn)防盜鏈功能的示例代碼

    springboot實(shí)現(xiàn)防盜鏈功能的示例代碼

    防盜鏈(Hotlink Protection)是一種防止其他網(wǎng)站直接鏈接到你網(wǎng)站的資源,從而節(jié)省帶寬和保護(hù)內(nèi)容的有效手段,下面我們就來(lái)看看如何使用springboot實(shí)現(xiàn)防盜鏈功能吧
    2024-12-12
  • Java springboot探究配置文件優(yōu)先級(jí)

    Java springboot探究配置文件優(yōu)先級(jí)

    在springboot項(xiàng)目中,我們可以通過(guò)在yml文件中設(shè)置變量,再通過(guò)@Value注解來(lái)獲得這個(gè)變量并使用,但如果這個(gè)項(xiàng)目已經(jīng)部署到服務(wù)器上,我們想更改這個(gè)數(shù)據(jù)了需要怎么做呢,其實(shí)在springboot項(xiàng)目中,配置文件是有優(yōu)先級(jí)的
    2023-04-04
  • 詳解Java對(duì)象的強(qiáng)、軟、弱和虛引用+ReferenceQueue

    詳解Java對(duì)象的強(qiáng)、軟、弱和虛引用+ReferenceQueue

    這篇文章主要介紹了詳解Java對(duì)象的強(qiáng)、軟、弱和虛引用+ReferenceQueue的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java 對(duì)稱二叉樹的判斷

    java 對(duì)稱二叉樹的判斷

    這篇文章主要介紹了java 對(duì)稱二叉樹的判斷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 學(xué)會(huì)在Java中使用Optional功能

    學(xué)會(huì)在Java中使用Optional功能

    這篇文章主要介紹了學(xué)會(huì)在Java中使用Optional功能,在本文中,我們將了解如何、何時(shí)以及在哪里最好地應(yīng)用Optional,具體相關(guān)內(nèi)容需要的朋友可以參考下面文章內(nèi)容
    2022-09-09
  • java 二分法詳解幾種實(shí)現(xiàn)方法

    java 二分法詳解幾種實(shí)現(xiàn)方法

    這篇文章主要介紹了java 二分法詳解幾種方法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java實(shí)戰(zhàn)項(xiàng)目練習(xí)之球館在線預(yù)約系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)項(xiàng)目練習(xí)之球館在線預(yù)約系統(tǒng)的實(shí)現(xiàn)

    理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+maven+freemark+Mysql實(shí)現(xiàn)一個(gè)球館在線預(yù)約系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • java 動(dòng)態(tài)加載的實(shí)現(xiàn)代碼

    java 動(dòng)態(tài)加載的實(shí)現(xiàn)代碼

    這篇文章主要介紹了java 動(dòng)態(tài)加載的實(shí)現(xiàn)代碼的相關(guān)資料,Java動(dòng)態(tài)加載類主要是為了不改變主程序代碼,通過(guò)修改配置文件就可以操作不同的對(duì)象執(zhí)行不同的功能,需要的朋友可以參考下
    2017-07-07
  • Spring注解之@PropertySource詳解

    Spring注解之@PropertySource詳解

    這篇文章主要介紹了Spring注解之@PropertySource詳解,@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過(guò)YAML解析器,配合自定義PropertySourceFactory實(shí)現(xiàn)解析YAML文件,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

孝昌县| 沙河市| 宿迁市| 安龙县| 武穴市| 正阳县| 叶城县| 孝昌县| 凌云县| 神木县| 盱眙县| 郎溪县| 长武县| 互助| 休宁县| 甘泉县| 绥中县| 湖北省| 高密市| 象州县| 金川县| 平阴县| 揭西县| 屏山县| 远安县| 大余县| 新乡市| 兴化市| 清水县| 韶关市| 福建省| 子长县| 仁化县| 巧家县| 扬中市| 通道| 长乐市| 霸州市| 进贤县| 临湘市| 池州市|