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来启用。
相关推荐
Java调用Groovy类则稍微复杂一些,通常有两种主要方法: 1. **方法1:直接调用** - 如果你的开发环境(如IntelliJ IDEA或Eclipse)已经安装了Groovy解释器插件,那么可以直接在Java代码中像调用Java类一样调用...
总的来说,Java调用Groovy并实时加载数据库中的Groovy脚本是一种强大而灵活的解决方案,特别适用于需要频繁调整业务逻辑或进行热部署的场景。通过结合Java的稳定性和Groovy的动态性,我们可以构建出更适应变化的系统...
// Java代码调用Groovy类 public class Main { public static void main(String[] args) { HelloWorld.sayHello(); } } ``` 三、使用Grails或Spring Boot框架 Grails是基于Groovy的全栈Web应用框架,它简化了...
Java调用Groovy是一种常见的技术,特别是在开发过程中需要动态脚本支持时。Groovy是一种基于JVM(Java Virtual Machine)的、动态类型的编程语言,它与Java有着良好的互操作性,能够无缝集成到Java项目中。这篇博客...
Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...
Java调用Jython、JRuby和Groovy提供了强大的动态编程能力,使得开发者可以在Java应用中充分利用这些脚本语言的优点。了解如何在Java中正确地调用和管理这些脚本,对于提升开发效率和应用功能都有很大帮助。在实际...
- **GroovyObject接口**:Groovy类自动实现`GroovyObject`接口,这使得Java可以调用Groovy对象的方法。 2. **Groovy的优势**: - **动态性**:Groovy支持动态类型,这意味着变量的类型可以在运行时改变,这在编写...
本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...
首先,我们来看Java调用Groovy的情况。在示例中,我们定义了一个Groovy类`GroovyBean`,它包含一个字段`name`,一个构造函数,一个`calc`方法和一个静态的`hello`方法。在Java类`JavaCallGroovy`中,我们可以直接...
Jenkins Pipeline 调用 shell、python、java、groovy 脚本的正确使用姿势 Jenkins Pipeline 是一个强大的自动化工具,可以帮助开发者自动化构建、测试和部署流程。在设计 Pipeline 脚本的过程中,经常会遇到调用...
本文将深入探讨如何基于Groovy实现Java脚本的动态编译、部署和发布,并且介绍如何通过Groovy脚本直接调用Dubbo接口,从而提高开发效率和灵活性。 Groovy是一种基于Java平台的强大的动态编程语言,它具有简洁的语法...
在这个例子中,我们动态地定义了一个名为DynamicGroovy的类,并调用了它的sayHello方法。 动态代码执行在很多场景下非常有用,如配置驱动的应用程序、元编程、测试自动化以及插件系统。Groovy由于其简洁的语法和与...
5. **Groovy**: Groovy是基于JVM的动态语言,语法简洁,与Java高度兼容,可以直接调用Java库。Groovy可以用于编写Gradle构建脚本,使得构建过程更加简洁和灵活。此外,Groovy也常用于服务器端开发,如Grails框架,...
- **元编程**:Groovy提供了一系列强大的元编程工具,包括AST转换、动态方法调用等,允许开发者在编译或运行时修改程序的行为。 - **类型推断**:Groovy支持静态和动态类型的混合使用,可以通过类型推断减少代码量,...
在Groovy中调用Java方法时,Groovy提供了两种主要的方式:静态导入和动态方法调用。静态导入允许你省略类名,直接调用静态方法,如`import static java.lang.Math.*`后,你可以直接使用`sqrt(25)`。动态方法调用则...
Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...
总的来说,`groovy动态方法`和`MetaClass`、`ExpandoMetaClass`以及MOP是Groovy强大特性的体现,它们为开发者提供了在运行时改变类行为的能力,使得Groovy代码更加灵活多变。掌握这些概念和技巧,将有助于你编写出更...
Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...
本文将详细讲解在Android Studio 3.0中如何实现C++调用Java以及Java调用C++的过程。 首先,我们需要在Android Studio项目中配置NDK(Native Development Kit),它是Android用于编写和编译C/C++代码的工具集。在...
这包括如何在Java代码中调用Groovy脚本,以及如何在Groovy中调用Java类库。这种集成能力使得Groovy可以作为Java项目的脚本层或用于快速开发原型。 #### 5. Groovy在实际项目中的应用案例 为了帮助读者更好地理解...