Java动态脚本Groovy
程序员文章站
2022-03-12 22:05:52
目录1.groovy特性2.核心涉及3.java与groovy转换第一步:引入groovy依赖第二步:创建interface接口声明方法第三步:在resources目录下创建.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("=================="); } }
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; }
添加结果:
查询结果、控制台执行结果:
第三步:多次修改表数据值,查看执行结果
5.总语
目的达成,可见在不重启服务时,多次修改数据,脚本内容都会被动态加载。此处只是简单举例验证,可自行扩展
到此这篇关于java动态脚本groovy的文章就介绍到这了,更多相关java动态脚本groovy内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!