Java动态脚本Groovy的特性是什么
导读:本文共3161.5字符,通常情况下阅读需要11分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1.Groovy特性可将java代码在Groovy脚本动态编码、代码被修改达到不重启服务的目的(类似于热部署)2.核心涉及ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。GroovyClassLoader:动态地加载一个脚本并执行它的行... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。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("==================");}}
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;}
添加结果:
查询结果、控制台执行结果:
第三步:多次修改表数据值,查看执行结果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
Java动态脚本Groovy的特性是什么的详细内容,希望对您有所帮助,信息来源于网络。