91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java動態腳本Groovy的特性是什么

發布時間:2021-12-14 12:25:06 來源:億速云 閱讀:236 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Java動態腳本Groovy的特性是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java動態腳本Groovy的特性是什么”這篇文章吧。

1.Groovy特性

可將java代碼在Groovy腳本動態編碼、代碼被修改達到不重啟服務的目的(類似于熱部署)

2.核心涉及

  • ClassLoader:就是類的裝載器,它使JVM可以動態的載入Java類,JVM并不需要知道從什么地方(本地文件、網絡等)載入Java類,這些都由ClassLoader完成。

  • GroovyClassLoader:動態地加載一個腳本并執行它的行為。GroovyClassLoader是一個定制的類裝載器,負責解釋加載Java類中用到的Groovy類。

3.Java與Groovy轉換

第一步:引入Groovy依賴

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

第二步:創建interface接口聲明方法

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

第三步:在resources目錄下創建.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腳本加載...")
    }
}

第四步:創建Groovy腳本裝載類,動態解析腳本為Class

package com.example.groovy.testgroovy.task;

import groovy.lang.GroovyClassLoader;

public class GroovyUtils {

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

    public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader);
    //GroovyClassLoader:負責在運行時編譯groovy源代碼為Class的工作,從而使Groovy實現了將groovy源代碼動態加載為Class的功能。

    /**
     * .
     * 獲取實例化對象
     * @param script groovy腳本內容
     * @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;
    }
}

第五步:讀取腳本內容,執行腳本

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 {


    /**
     * .
     * 讀取腳本內容
     *
     * @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));//將腳本內容轉為字符串
        } catch (IOException e) {
            log.error("file is not found[{}]", e);
        }
        return context;
    }

    /**
     * .
     * 執行groovy腳本
     *
     * @param script
     */
    public static void execGroovy(String script) {
        try {
            CallAnalysis objClass = GroovyUtils.instanceTaskGroovyScript(script);//獲取實例對象
            objClass.load();//調用腳本方法
        } 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);//實例化腳本,執行方法
        System.out.println("==================");
    }
}

Java動態腳本Groovy的特性是什么

4.Groovy特性驗證

利用Groovy腳本特性,不重啟服務,實時修改數據

第一步:將之前Groovy腳本數據修改。存于數據庫表中,動態加載腳本

@Slf4j
class CallAnalysisImpl implements CallAnalysis {

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

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

第二步:數據庫表中:添加、查詢Groovy腳本,動態加載執行

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


    /**
     * .
     * 從數據庫表中,動態獲取腳本
     *
     * @param ruleId 規則id
     * @return 腳本內容
     */
    @GetMapping("/groovy")
    public String groovy(final String ruleId) {
        Script scr = scriptService.findScriptByRuleId(ruleId);//根據規則id查詢
        String scriptStr = scr.getScript();
        callAnalysisGroovyTask.execGroovy(scriptStr);
        return scriptStr;
    }

添加結果:

Java動態腳本Groovy的特性是什么

 查詢結果、控制臺執行結果:

Java動態腳本Groovy的特性是什么

第三步:多次修改表數據值,查看執行結果

Java動態腳本Groovy的特性是什么

以上是“Java動態腳本Groovy的特性是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

来凤县| 武清区| 陆良县| 华容县| 两当县| 台南市| 雅江县| 德阳市| 汝州市| 齐齐哈尔市| 博野县| 札达县| 黎川县| 二手房| 厦门市| 拉萨市| 延吉市| 玛纳斯县| 济阳县| 克拉玛依市| 仙桃市| 富源县| 博乐市| 盐城市| 兰考县| 崇州市| 靖边县| 镇远县| 施秉县| 衡东县| 柘荣县| 奉化市| 和静县| 汉源县| 汉寿县| 义乌市| 康乐县| 蚌埠市| 甘德县| 南康市| 搜索|