`
cooperay
  • 浏览: 215635 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Java动态 调用Groovy的方法

 
阅读更多

1、静态编译,在java工程中直接写groovy的文件,然后可以在Groovy的文件中引用Java工程的类,这种方式能够有效的利用groovy自身的语言特性,例如闭包; (这种方式上面已经提及,不适合我们目前需求)
2、通过groovyShell类直接执行脚本,例如:

  1. Binding bind =newBinding();
  2. bind.setVariable("str","test");
  3. GroovyShell shell =newGroovyShell(bind);
  4. Object obj = shell.evaluate("return str");
  5. System.out.println(obj);

3、通过groovyScriptEngine执行文件或者脚本,例如:

  1. GroovyScriptEngine engine =newGroovyScriptEngine("groovy");
  2. Object obj = engine.run("test.groovy","test");
  3. System.out.println(obj);

​4、通过GroovyClassLoader来执行,例如:

  1. String script="";//groovy script
  2. ClassLoader parent =ClassLoader.getSystemClassLoader();
  3. GroovyClassLoader loader =newGroovyClassLoader(parent);
  4. Class<?> clazz = loader.parseClass(script);
  5. GroovyObject clazzObj =(GroovyObject)clazz.newInstance();
  6. 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相互调用1

    Java调用Groovy类则稍微复杂一些,通常有两种主要方法: 1. **方法1:直接调用** - 如果你的开发环境(如IntelliJ IDEA或Eclipse)已经安装了Groovy解释器插件,那么可以直接在Java代码中像调用Java类一样调用...

    Java调用Groovy,实时动态加载数据库groovy脚本

    总的来说,Java调用Groovy并实时加载数据库中的Groovy脚本是一种强大而灵活的解决方案,特别适用于需要频繁调整业务逻辑或进行热部署的场景。通过结合Java的稳定性和Groovy的动态性,我们可以构建出更适应变化的系统...

    Java中使用Groovy的三种方式

    // Java代码调用Groovy类 public class Main { public static void main(String[] args) { HelloWorld.sayHello(); } } ``` 三、使用Grails或Spring Boot框架 Grails是基于Groovy的全栈Web应用框架,它简化了...

    Java调用Groovy

    Java调用Groovy是一种常见的技术,特别是在开发过程中需要动态脚本支持时。Groovy是一种基于JVM(Java Virtual Machine)的、动态类型的编程语言,它与Java有着良好的互操作性,能够无缝集成到Java项目中。这篇博客...

    java 动态脚本语言 精通 Groovy

    Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...

    java调用脚本语言笔记(jython,jruby,groovy)

    Java调用Jython、JRuby和Groovy提供了强大的动态编程能力,使得开发者可以在Java应用中充分利用这些脚本语言的优点。了解如何在Java中正确地调用和管理这些脚本,对于提升开发效率和应用功能都有很大帮助。在实际...

    hugo110-java_run_groovy-master_java_

    - **GroovyObject接口**:Groovy类自动实现`GroovyObject`接口,这使得Java可以调用Groovy对象的方法。 2. **Groovy的优势**: - **动态性**:Groovy支持动态类型,这意味着变量的类型可以在运行时改变,这在编写...

    JVM 动态执行Groovy脚本的方法

    本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...

    java与groovy互相调用1

    首先,我们来看Java调用Groovy的情况。在示例中,我们定义了一个Groovy类`GroovyBean`,它包含一个字段`name`,一个构造函数,一个`calc`方法和一个静态的`hello`方法。在Java类`JavaCallGroovy`中,我们可以直接...

    干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc

    Jenkins Pipeline 调用 shell、python、java、groovy 脚本的正确使用姿势 Jenkins Pipeline 是一个强大的自动化工具,可以帮助开发者自动化构建、测试和部署流程。在设计 Pipeline 脚本的过程中,经常会遇到调用...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    本文将深入探讨如何基于Groovy实现Java脚本的动态编译、部署和发布,并且介绍如何通过Groovy脚本直接调用Dubbo接口,从而提高开发效率和灵活性。 Groovy是一种基于Java平台的强大的动态编程语言,它具有简洁的语法...

    java动态代码执行

    在这个例子中,我们动态地定义了一个名为DynamicGroovy的类,并调用了它的sayHello方法。 动态代码执行在很多场景下非常有用,如配置驱动的应用程序、元编程、测试自动化以及插件系统。Groovy由于其简洁的语法和与...

    SpringBoot-Gradle-Maven-Java-Groovy

    5. **Groovy**: Groovy是基于JVM的动态语言,语法简洁,与Java高度兼容,可以直接调用Java库。Groovy可以用于编写Gradle构建脚本,使得构建过程更加简洁和灵活。此外,Groovy也常用于服务器端开发,如Grails框架,...

    Java Groovy

    - **元编程**:Groovy提供了一系列强大的元编程工具,包括AST转换、动态方法调用等,允许开发者在编译或运行时修改程序的行为。 - **类型推断**:Groovy支持静态和动态类型的混合使用,可以通过类型推断减少代码量,...

    groovy调用java-se类库学习案例 Java学习资料

    在Groovy中调用Java方法时,Groovy提供了两种主要的方式:静态导入和动态方法调用。静态导入允许你省略类名,直接调用静态方法,如`import static java.lang.Math.*`后,你可以直接使用`sqrt(25)`。动态方法调用则...

    java在嵌入运行groovy代码1

    Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...

    groovy动态方法

    总的来说,`groovy动态方法`和`MetaClass`、`ExpandoMetaClass`以及MOP是Groovy强大特性的体现,它们为开发者提供了在运行时改变类行为的能力,使得Groovy代码更加灵活多变。掌握这些概念和技巧,将有助于你编写出更...

    java 远程调用工具

    Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...

    Android Studio3.0开发JNI流程------C++调用Java以及Java调用C++,C++/Java互相调用

    本文将详细讲解在Android Studio 3.0中如何实现C++调用Java以及Java调用C++的过程。 首先,我们需要在Android Studio项目中配置NDK(Native Development Kit),它是Android用于编写和编译C/C++代码的工具集。在...

    groovy programming(2006.12).pdf

    这包括如何在Java代码中调用Groovy脚本,以及如何在Groovy中调用Java类库。这种集成能力使得Groovy可以作为Java项目的脚本层或用于快速开发原型。 #### 5. Groovy在实际项目中的应用案例 为了帮助读者更好地理解...

Global site tag (gtag.js) - Google Analytics