Java动态脚本Groovy的特性是什么(groovy,java,开发技术)

时间:2024-05-06 07:38:21 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

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接口声明方法

publicinterfaceCallAnalysis{defaultvoidload(){}}

第三步:在resources目录下创建.groovy文件

packagegroovyimportcom.example.groovy.testgroovy.task.CallAnalysisimportgroovy.util.logging.Slf4j@Slf4jclassCallAnalysisImplimplementsCallAnalysis{@Overridevoidload(){log.info("我被Groovy脚本加载...")}}

第四步:创建Groovy脚本装载类,动态解析脚本为Class

packagecom.example.groovy.testgroovy.task;importgroovy.lang.GroovyClassLoader;publicclassGroovyUtils{privatefinalstaticClassLoaderclassLoader=GroovyUtils.class.getClassLoader();//获取当前类装载器//ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。publicfinalstaticGroovyClassLoadergroovyClassLoader=newGroovyClassLoader(classLoader);//GroovyClassLoader:负责在运行时编译groovy源代码为Class的工作,从而使Groovy实现了将groovy源代码动态加载为Class的功能。/***.*获取实例化对象*@paramscriptgroovy脚本内容*@param<T>*@return*@throwsIllegalAccessException*@throwsInstantiationException*/publicstatic<T>TinstanceTaskGroovyScript(Stringscript)throwsIllegalAccessException,InstantiationException{ClasstaskClz=groovyClassLoader.parseClass(script);Tinstance=(T)taskClz.newInstance();returninstance;}}

第五步:读取脚本内容,执行脚本

packagecom.example.groovy.testgroovy.task;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.io.FileUtils;importorg.springframework.stereotype.Component;importjava.io.File;importjava.io.IOException;@Slf4j@ComponentpublicclassCallAnalysisGroovyTask{/***.*读取脚本内容**@return*/publicstaticStringgetGroovy(){Stringcontext="";try{Stringpath="E:\\IDEAFile\\testgroovy\\src\\main\\resources\\groovy\\CallAnalysisImpl.groovy";context=FileUtils.readFileToString(newFile(path));//将脚本内容转为字符串}catch(IOExceptione){log.error("fileisnotfound[{}]",e);}returncontext;}/***.*执行groovy脚本**@paramscript*/publicstaticvoidexecGroovy(Stringscript){try{CallAnalysisobjClass=GroovyUtils.instanceTaskGroovyScript(script);//获取实例对象objClass.load();//调用脚本方法}catch(Exceptiont){log.error("execGroovyfile{}error",script);}}/***.*main方法*@paramargs*/publicstaticvoidmain(String[]args){System.out.println("==================");CallAnalysisGroovyTasktask=newCallAnalysisGroovyTask();Stringscript=task.getGroovy();//获取脚本execGroovy(script);//实例化脚本,执行方法System.out.println("==================");}}

Java动态脚本Groovy的特性是什么

4.Groovy特性验证

利用Groovy脚本特性,不重启服务,实时修改数据

第一步:将之前Groovy脚本数据修改。存于数据库表中,动态加载脚本

@Slf4jclassCallAnalysisImplimplementsCallAnalysis{privateintanInt=10;privateintbnInt=10;@Overridevoidload(){log.info("当前类:[{}]",this.getClass().getName())log.info("我被Groovy脚本加载...")log.info("计算结果:[{}]",(anInt+bnInt))}}

第二步:数据库表中:添加、查询Groovy脚本,动态加载执行

/***.*读取脚本,进行入库操作**@return*/@GetMapping("/saveScript")publicStringsaveScript(){StringscriptStr=callAnalysisGroovyTask.getGroovy();Scriptscript=newScript();//实体类对象script.setScript(scriptStr);//脚本内容script.setRuleId("1");//规则idscript.setScriptName("演示一");//脚本名称service.save(script);return"添加成功";}/***.*从数据库表中,动态获取脚本**@paramruleId规则id*@return脚本内容*/@GetMapping("/groovy")publicStringgroovy(finalStringruleId){Scriptscr=scriptService.findScriptByRuleId(ruleId);//根据规则id查询StringscriptStr=scr.getScript();callAnalysisGroovyTask.execGroovy(scriptStr);returnscriptStr;}

添加结果:

Java动态脚本Groovy的特性是什么

查询结果、控制台执行结果:

Java动态脚本Groovy的特性是什么

第三步:多次修改表数据值,查看执行结果

Java动态脚本Groovy的特性是什么

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Java动态脚本Groovy的特性是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Mybatis Example怎么用下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18