1、静态编译,在java工程中直接写groovy的文件,然后可以在Groovy的文件中引用Java工程的类,这种方式能够有效的利用groovy自身的语言特性,例如闭包; (这种方式上面已经提及,不适合我们目前需求)
2、通过groovyShell类直接执行脚本,例如:
- Binding bind =newBinding();
- bind.setVariable("str","test");
- GroovyShell shell =newGroovyShell(bind);
- Object obj = shell.evaluate("return str");
- System.out.println(obj);
3、通过groovyScriptEngine执行文件或者脚本,例如:
- GroovyScriptEngine engine =newGroovyScriptEngine("groovy");
- Object obj = engine.run("test.groovy","test");
- System.out.println(obj);
4、通过GroovyClassLoader来执行,例如:
- String script="";//groovy script
- ClassLoader parent =ClassLoader.getSystemClassLoader();
- GroovyClassLoader loader =newGroovyClassLoader(parent);
- Class<?> clazz = loader.parseClass(script);
- GroovyObject clazzObj =(GroovyObject)clazz.newInstance();
- System.out.println(clazzObj.invokeMethod("test","str"));
需要注意的是,通过看groovy的创建类的地方,就能发现,每次执行的时候,都会新生成一个class文件,这样就会导致JVM的perm区持续增长,进而导致FullGCc问题,解决办法很简单,就是脚本文件变化了之后才去创建文件,之前从缓存中获取即可,缓存的实现可以采用简单的Map或者使用之前文章提到的EhCache(同时可以设置缓存有效期,降低服务器压力)。
在使用时,最好每次重新new classloader,因为如果脚本重新加载了,这时候就会有新老两个class文件,如果通过一个classloader持有的话,这样在GC扫描的时候,会认为老的类还在存活,导致回收不掉,所以每次new一个就能解决这个问题了。
注意CodeCache的设置大小(来自:http://hellojava.info/)
对于大量使用Groovy的应用,尤其是Groovy脚本还会经常更新的应用,由于这些Groovy脚本在执行了很多次后都会被JVM编译为native进行优化,会占据一些CodeCache空间,而如果这样的脚本很多的话,可能会导致CodeCache被用满,而CodeCache一旦被用满,JVM的Compiler就会被禁用,那性能下降的就不是一点点了。
Code Cache用满一方面是因为空间可能不够用,另一方面是Code Cache是不会回收的,所以会累积的越来越多(其实在不采用groovy这种动态更新/装载class的情况下的话,是不会太多的),所以解法一可以是增大code cache的size,可通过在启动参数上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那边也是推荐把code cache调大的),二是启用code cache的回收机制(关于Code Cache flushing的具体策略请参见此文),可通过在启动参数上增加:-XX:+UseCodeCacheFlushing来启用。
相关推荐
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
Java中使用Groovy的三种方式,详细见我的博客。
NULL 博文链接:https://yangwencan2002.iteye.com/blog/260697
概述主要介绍Java、spring与groovy结合使用,高清英文版本
基于groovy框架,进行的简单java动态代码执行;附件中包含java调用groovy具体的代码实现,及测试方法。
干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc
NULL 博文链接:https://yinxvxv.iteye.com/blog/811328
}}编写一个 Groovy 类调用以上的 Java Beanclass GroovyCallJava { static void main(args) { Ja
脚本通过上下文applicationcontext获取被测试应用bean,从而可以进行接口内容获取等操作。目前该方式主要运用到性能平台脚本搭建、代码深度测试、接口测试、白盒测试等多方面。...支持Java、groovy脚本。
Groovy介绍 什么是Groovy Groovy基本语法 Groovy正则 Java调用Groovy Groovy模板 Groovy应用
groovy-se-study 本工程用于学习groovy和java-se的调用
下载的资源文件中,封装了并发计算以及内存溢出解决方案的工具类GroovyEngine.java,调用示例: GroovyEngine engine = GroovyEngine.getInstance(); engine.put("a",1); engine.put("b",2); Object v1 = engine....
1、eclipse安装groovy的插件。 2、创建java project。 3、把groovy-all-2.1.9.jar,加入...4、编写hello.groovy脚本文件,并在java代码中调用脚本文件 http://blog.csdn.net/bolg_hero/article/details/19077981
基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口
在dubbo服务运行过程中,上传正确的java代码文件,自动编译生成class并注册到dubbo zk 中,可以正常dubbo invoke来调用。整个过程服务不用重启。我写了个框架并命名为D-Unit。
是Java语言扩展,因此可以与Java语言互相调用。在所有基于JVM虚拟机的语言中只有Scala可以媲美。使用Groovy可以快速灵活完成文本处理,数据库访问,XML处理等常见任务。研究表明,使用Groovy比使用Java写程序,代码量...
运行在Java虚拟机上,敏捷、动态的语言 建立在Java的基础上,同时,吸收了其他语言的优点,比如:Python、 Ruby 和 Smalltalk Java开发人员,上手快,几乎没有学习曲线 提供静态类型检查和编译,提高...
通过这个工具,程序猿可以动态调用java web工程里的资源,比如可以通过groovy script 来动态调用spring的bean。 出现线上bug的时候这个工具及其好用。可以通过groovy脚本来动态调用系统中的各个子单元并查看结果,...
方法执行时,并不执行原来的代码,而是动态解析groovy代码,调用groovy方法。 我们可以在相关的groovy代码中配置哪些类的方法执行groovy方法,哪些类的方法执行原来的逻辑。 当然,在groovy方法中,我们可以执行原有...