可将java
代码在groovy
脚本动态编码、代码被修改达到不重启服务的目的(类似于热部署)
classl青年节黑板报oader
:就是类的装载器,它使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>
public interface callanalysis { default void load() { }}
package groovyimport com.example.groovy.testgroovy.task.callanalysisimport groovy.util.logging.slf4j@slf4jclass 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 illegalaccesxception * @throws instantiationexception */ public static <t> t instancetaskgroovyscript(string script) throws illegalaccesxception, instantiationexception { class taskclz = groovyclassloader.parclass(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@componentpublic 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.loa日照有什么大学d();//调用脚本方法 } 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
脚本特性,不重启服务,实时修改数据
@slf4jclass 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.tscript(scriptstr);//脚本内容 script.truleid("1");//规则id script.tscriptname("演示一");//脚本名称 rvice.save(script); return "添加成功"; } /** * . * 从数据库表中,动态获取脚本 * * @param ruleid 规则id * @return 脚本内容 */ @getmapping("/groo劳动感悟vy") public string groovy(final string ruleid) { script scr = scriptrvice.findscriptbyruleid(ruleid);//根据规则id查询 string scriptstr = scr.getscript(); callanalysisgroovytask.execgroovy(scriptstr); return scriptstr; }
添加结果:
查询结果、控制台执行结果:
目的达成,可见在不重启服务时,多次修改数据,脚本内容都会被动态加载。此处只是简单举例验证,可自行扩展
到此这篇关于java动态脚本groovy的文章就介绍到这了,更多相关java动态脚本groovy内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 02:52:06,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/573a8a44f1125c546f97e6a5eeae6bc7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java动态脚本Groovy.doc
本文 PDF 下载地址:Java动态脚本Groovy.pdf
留言与评论(共有 0 条评论) |