大佬教程收集整理的这篇文章主要介绍了Java动态脚本Groovy,高级啊!,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
可将java代码在Groovy脚本动态编码、代码被修改达到不重启服务的目的(类似于热部署)
ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。
GroovyClassLoader:动态地加载一个脚本并执行它的行为。GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。
<!--Groovy脚本依赖--> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.5.14</version> </dependency>
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();//获取当前类装载器 //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("=================="); } }
利用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)) } }
/** * . * 读取脚本,进行入库操作 * * @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,高级啊!所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。