您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java動(dòng)態(tài)腳本Groovy的特性是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java動(dòng)態(tài)腳本Groovy的特性是什么”這篇文章吧。
可將java
代碼在Groovy
腳本動(dòng)態(tài)編碼、代碼被修改達(dá)到不重啟服務(wù)的目的(類似于熱部署)
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類。
<!--Groovy腳本依賴--> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.5.14</version> </dependency>
public interface CallAnalysis { default void load() { } }
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腳本加載...") } }
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; } }
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("=================="); } }
利用Groovy
腳本特性,不重啟服務(wù),實(shí)時(shí)修改數(shù)據(jù)
@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)) } }
/** * . * 讀取腳本,進(jìn)行入庫操作 * * @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ù)庫表中,動(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é)果:
以上是“Java動(dòng)態(tài)腳本Groovy的特性是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。